PDO UPDATE, похоже, не сохраняет кавычки?

Я только начинаю с методов PDO, и теперь я застрял в небольшом вопросе. Если я создам форму для вставки имени и фамилии в базу данных, я могу вставить все типы специальных символов с кодом ниже:

try { $db = new PDO('mysql:dbhost=' . $dbhost . ';dbname=' . $dbname, $dbuser, $dbpass); $db -> exec("SET CHARACTER SET utf8"); } catch(PDOException $e) { echo $e->getMessage(); } $query = $db->prepare("INSERT INTO users(fname, lname) VALUES(:fname, :lname)"); $insert_array = array( ":fname" => $fname, ":lname" => $lname ); $query->execute($insert_array); $db = NULL; 

Я могу вставить ":;,-!"#¤%&&(%)?{][]}£$€{{{$@@_--" без каких-либо проблем даже вставить SQL-инъекцию. Но когда я попробуйте обновить базу данных с помощью аналогичного кода, который принимает все типы специальных символов, кроме кавычек. Почему это? Код, который я использую для обновления:

 try { $db = new PDO('mysql:dbhost=' . $dbhost . ';dbname=' . $dbname, $dbuser, $dbpass); $db -> exec("SET CHARACTER SET utf8"); } catch(PDOException $e) { echo $e->getMessage(); } $query = $db->prepare("UPDATE users SET fname=:fname, lname=:lname WHERE userid=:userid"); $update_array = array( ":fname" => $fname, ":lname" => $lname, ":userid" => $_GET['userid'] ); $query->execute($update_array); $db = NULL; 

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

– = РЕШЕНИЕ = –

Мне пришлось использовать htmlspecialchars() для «декодирования» строки. Как это:

 <form action="" method="post"> First name<br><input type="text" name="fname" value="'.htmlspecialchars($user['fname']).'"> Last name: <br><input type="text" name="lname" value="'.htmlspecialchars($user['lname']).'"> <input type="submit"> </form> 

Теперь все виды специальных персонажей прекрасно работают. Спасибо за помощь всем, очень ценю! : D

Уверенный хан прав, я верю. Не обязательно в этом случае использовать себя (хотя это явная уязвимость, которую вы показываете здесь, и оставляете дверь открытой для таких атак), но вместо этого просто разбивая ваш html, насколько я могу судить.

Просто повторяя значения $user['fname'] и $user['lname'] raw – которые содержат двойные кавычки из предыдущего представления – вы непреднамеренно допускаете преждевременное закрытие значения атрибута элемента html при его рисовании, тем самым нарушая ваш HTML-код форма. Удивительно, что он все равно подчиняется вообще. В своем браузере проверьте что-то вроде Firebug и просмотрите форму – вы должны увидеть, что вход странно сформирован и, возможно, некоторые дополнительные символы, нарисованные после него.

Всегда используйте htmlentities () или другие подобные вспомогательные функции escape-функции в значениях PHP, прежде чем их эхо их прямо в HTML. Всегда.

Пример:

 <form action="" method="post"> First name<br><input type="text" name="fname" value="<?php echo htmlentities( $user['fname'], ENT_COMPAT, 'UTF-8' ); ?>"> Last name: <br><input type="text" name="lname" value="<?php echo htmlentities( $user['lname'], ENT_COMPAT ); ?>"> <input type="submit"> </form> 

Измените: в отношении вашего утверждения, что «И он работает, чтобы обновить кавычки, если я удалю кавычки в значении формы», что я подразумеваю, что вы устанавливаете значения атрибутов элемента HTML, используя одиночные кавычки, а не двойные кавычки, действительно не работает вообще.

Если пользователь отправил значение с одинарными кавычками, он аналогичным образом нарушит ваш фиксированный пример, потому что одна цитата в значении преждевременно закрывает объявление значения атрибута элемента HTML. Использование двойных кавычек для объявления значения атрибута элемента HTML лучше всего, но если вы решите использовать одинарные кавычки при создании элемента HTML, то в PHP используйте htmlentities($string, ENT_QUOTES) .

htmlentities страницу руководства htmlentities но убедитесь, что используете ее правильно.