Нужен ли mysqlnd для параметризованных запросов SQLi в PHP?

Я читал, как параметризованные запросы помогают предотвратить SQL-инъекции, однако, к моему удивлению, реализовать их оказалось сложнее, чем я предполагал.

Я попытался выполнить простой оператор SELECT, используя mysqli в PHP, используя параметризованный запрос, и я получаю фатальную ошибку PHP, утверждающую, что я вызвал неизвестный метод при попытке получить результат запроса. После поиска в Google говорится, что мне нужно установить mysqlnd и включить его для получения результата. Я также обнаружил, что mysqlnd должен быть установлен по умолчанию на PHP 5.4 или более поздней версии. В настоящее время я использую 5.4.3, поэтому я ожидал, что это сработает.

Во-первых, мне нужно mysqlnd использовать параметризованные запросы или это необходимо только для более продвинутых пользователей и запросов? Есть ли метод, который вы можете использовать без mysqlnd для получения результата? Во-вторых, если мне это нужно, как мне включить его в моем PHP?

PHP:

$stmt = $con->prepare("SELECT some_id FROM some_table WHERE name = ? AND user_id = '$user_id'");
$stmt->bind_param('s', $name);
$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // do something with result
}

Ошибка:

Неустранимая ошибка PHP: вызов неопределенного метода mysqli_stmt::get_result()


person user3054325    schedule 02.01.2015    source источник
comment
Можем ли мы увидеть ваш код, отредактированный в вопросе? Какой метод неизвестен?   -  person halfer    schedule 03.01.2015
comment
@halfer добавил код и сообщение об ошибке.   -  person user3054325    schedule 03.01.2015


Ответы (1)


Если вы посмотрите руководство для get_result, там действительно говорится ему нужно расширение mysqlnd:

Доступно только с mysqlnd.

Если вы просто хотите получить результаты из запроса SELECT, вы можете использовать привязку выходных параметров, основой которой является bind_result. Это, кажется, не нуждается в дополнительном расширении.

Несколько примеров того, как это сделать, приведены в руководстве по PHP здесь. Я предполагаю, что преимущество get_result заключается в том, что вы можете читать столбцы без их привязки. Вы должны иметь возможность включить это в своем php.ini - возможно, оно закомментировано по умолчанию?

Я лично не использовал MySQLi, поскольку я видел, помогая с переполнением стека, что многие люди разочаровываются в API. Я всегда использовал PDO/mysql и не вижу причин переключаться. Возможно, стоит попробовать, чтобы узнать, предпочитаете ли вы это.

person halfer    schedule 03.01.2015