PHP MySQLi Параметризованный Запрос не работает - PullRequest
0 голосов
/ 27 декабря 2018

Я обновляю свои текущие незащищенные запросы на параметризованные для защиты от SQL-инъекций.

Я потратил несколько часов, пытаясь разобраться в этом, однако не могу найти проблему, любая помощь очень ценится.

BEFORE (echo $ row ['storeID'];) работает до

$storeName = mysqli_real_escape_string($conn,$_GET['store']); 
$query = "SELECT * FROM stores WHERE storeName = '$storeName'";
$results = mysqli_query($conn, $query);
$row = mysqli_fetch_assoc($results);

ПОСЛЕ

$storeName = $_GET['store'];
$stmt = mysqli_prepare($conn, "SELECT * FROM stores WHERE storeName = ?");
mysqli_stmt_bind_param($stmt, "s", $storeName);
mysqli_stmt_execute($stmt);
$row = mysqli_stmt_fetch($stmt);

Этот эхо должно работать, но с использованием операторов это не

 echo $row['storeID']; 

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Вы пропустили вызов на mysqli_stmt_get_result перед извлечением строки:

$storeName = $_GET['store'];
$stmt = mysqli_prepare($conn, "SELECT * FROM stores WHERE storeName = ?");
mysqli_stmt_bind_param($stmt, "s", $storeName);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$row = mysqli_fetch_assoc($result);

echo $row['id'];
0 голосов
/ 27 декабря 2018

Если вы посмотрите документацию для mysqli_stmt_fetch, вы увидите это описание:

Извлечение результатов из подготовленного оператора в связанные переменные

Так что, если вы хотите пойти по этому пути, вам понадобится также mysqli_stmt_bind_result:

$storeName = $_GET['store'];
$stmt = mysqli_prepare($conn, "SELECT * FROM stores WHERE storeName = ?");
mysqli_stmt_bind_param($stmt, "s", $storeName);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $col1, $col2, $col3,...);
while (mysqli_stmt_fetch($stmt)) {
    // do stuff with $col1, $col2, etc.
}

Теперь, с каждой итерацией цикла,связанным переменным результата присваивается значение из набора результатов.


Однако я настоятельно рекомендую перейти на PDO, который гораздо менее многословен:

$storeName = $_GET['store'];
$stmt = $db->prepare("SELECT * FROM stores WHERE storeName = ?");
$stmt->execute([$storeName]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

// now you have a simple array with all your results
foreach ($rows as $row) {
    // do stuff with $row
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...