Я использую форму для обновления данных, отображаемых на сайте. Это просто текстовая информация, но она будет содержать апострофы и цитаты.
Я полагал, что использование подготовленного оператора с параметрами как для оператора SQL Update, так и для операторов Select автоматически экранирует и отменяет экранирование специальных символов соответственно. Похоже, этого не происходит. В подготовленном заявлении все еще есть апостроф из-за неправильного формата утверждения из-за апострофа.
Я работаю над этим, используя mysqli_real_escape_string в своих строках перед обновлением, но когда я получаю строки с помощью другого подготовленного оператора (выберите с одним параметром), экранированный апостроф отображается в тексте на странице html (например: / 'hello /' вместо ' Привет' ).
Поэтому я использую полосы-слеши. Это работает, но я думал, что подготовленные операторы mysqli сделали это за вас. Любые идеи?
Обновлять:
$mysqli = new mysqli($servername, $username, $password, $dbname);
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
$sql = "UPDATE table SET mycol= ? WHERE myparam= ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ss', $mycol, $myparam);
if (!$stmt->execute()) {
echo "Error updating record: " . $stmt->error;
}
Получать:
$mysqli = new mysqli($servername, $username, $password, $dbname);
if ($mysqli->connect_error)
{
die("$mysqli->connect_errno: $mysqli->connect_error");
}
$sql= "Select * From table Where myvar= ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("s", $myparam);
$stmt->execute();
$stmt_result = $stmt->get_result();
if ($stmt_result->num_rows>0) {
$row = $stmt_result->fetch_assoc(); }
Используйте функцию mysqli_real_escape_string, чтобы избежать угроз безопасности.
В настоящее время я использую mysqli_real_escape_string, но я думал, что подготовленный оператор с параметрами сделал это для параметра. Я ошибся?
Извините, что беспокою людей!
Подготовленный оператор работает так, как задумано, и мне не нужно использовать mysqli_real_escape_string.
Проблема, с которой я столкнулся впоследствии, заключалась в том, что я дважды экранировал текст. Это исправлено.
Спасибо всем кто ответил!
Я не использовал Mysqli примерно 5 лет, но я уверен, что PDO делает этот
This works but I thought that mysqli prepared statements did this for you
, какую именно ошибку вы получаете. Я знаю, что если вы попытаетесь присоединиться к текстовому файлу с'
, у вас возникнут проблемы, но это не вина PDO. Это единственная проблема, которую я видел с цитатами.