У меня сложилось впечатление, что подготовленные операторы PDO также делали то, что делал старый MYSQL_REAL_ESCAPE_STRING. Мой код использует подготовленные операторы следующим образом:
$updatesql = "UPDATE projects
SET title= ?, project_status= ?, bpm= ?, genre= ?, release_genre= ?,
vocals= ?, lyrics_written= ?, voice_of= ?, start_date= ?, finish_date= ?,
project_time= ?, file_name= ?, mixed= ?, mastered= ?, mixed_by= ?,
mastered_by= ?, loudness_level= ?, release_date= ?, artwork_link= ?,
audio_link= ?, length= ?, lyrics_link= ?, priority= ?, notes= ?, lyrics= ?,
project_key= ?, featuring= ?, producers= ? WHERE id= ?
LIMIT 1";
//update record with PDO
$pdo->prepare($updatesql)->execute([$title, $project_status, $bpm, $genre, $release_genre,
$vocals, $lyrics_written, $voice_of, $start_date, $finish_date,
$project_time,$file_name, $mixed, $mastered, $mixed_by,
$mastered_by, $loudness_level, $release_date, $artwork_link,
$audio_link, $length, $lyrics_link, $priority, $notes, $lyrics,
$project_key, $featuring, $producers, $id ]);
но я обнаружил, что если форма отправляет слово O'riely, это вызывает ОШИБКУ MYSQL.
я НЕ МОГУ ИСПОЛЬЗОВАТЬ mysqli_real_escape_string, потому что он ожидает подключения mysqli в качестве 1-го параметра, и я использую PDO.
Является ли единственным другим решением использовать добавочные слэши для всех моих вставок БД, а затем стриптиз-слэши для всех моих полей отображаемых данных? Это похоже на то, что мы сделали бы всего 10 лет назад. Что мне не хватает, поскольку это относится к передовой практике обработки апострофа и т. д. При использовании подготовленных операторов PDO?
Обновлено:
Информация о моей локальной среде/сервере выглядит следующим образом: Сервер: Localhost через сокет UNIX Тип сервера: MySQL Версия сервера: 5.7.26-0ubuntu0.18.04.1 - (Ubuntu) Версия протокола: 10 Пользователь: root@localhost Кодировка сервера: Юникод UTF-8 (utf8) Апач/2.4.29 (Убунту) Версия клиента базы данных: libmysql - mysqlnd 5.0.12-dev - 20150407 - $Id: 3591daad22de08524295e1bd073aceeff11e6579 $ Расширение PHP: mysqliDocumentation mbstringDocumentation Версия PHP: 7.2.17-0ubuntu0.18.04.1
СООБЩЕНИЕ ОБ ОШИБКЕ:
INSERT INTO projects ( title, project_status, bpm, genre, release_genre,
vocals, lyrics_written, voice_of, start_date, finish_date,
project_time, file_name, mixed, mastered, mixed_by,
mastered_by, loudness_level, release_date, artwork_link, audio_link,
length, lyrics_link, priority, notes, lyrics,
project_key,featuring, producers )
VALUES ( 'wyatt's', 'Idea Only','99', '99', '99',
'0','0', '', '1969-12-31', '1969-12-31',
'0', '', '0', '0', '',
'', '', '1969-12-31', '', '',
'', '', '3', '', '',
'','', '')
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's', 'Idea Only','99', '99', '99', '0','0', '', '1969-12-31', '1969-12-31', '0',' at line 7
Обычное «в вашем операторе mysql есть ошибка рядом с« riley .. », что указывает на то, что mysql отклонил синтаксис оператора прямо в апостифе. Я опубликую актуальную ошибку утром.
Вероятно, было бы полезно также опубликовать имя поля и тип данных, с которыми у вас возникли проблемы.
какие версии вы используете? особенно php, pdo, mysql-драйверы и mysql-сервер? мое первое предположение было бы устаревшей версией с ошибками, а второе - проблемой конфигурации. потому что эта ошибка может произойти только в том случае, если фактические подготовленные операторы недоступны, и PDO должен эмулировать
@FranzGleichmann, даже если PDO должен эмулировать, очевидно такая ошибка никогда не произойдет.
@Nick и AT-FranzGleichman, я обновил свой пост сообщением об ошибке и информацией о моем локальном сервере. Я согласен, что этого не должно происходить, поскольку я использую подготовленные операторы, но, увы, мы здесь.
Запрос в сообщении об ошибке не соответствует вашему коду. (ОБНОВЛЕНИЕ против ВСТАВКИ)
Как указывает @GhostGambler, ошибка возникает из-за другого запроса. Возможно, что INSERT готовится нет?
ДУХ! Это оно! У меня есть prosses-new-project.php и process-edit-project.php, которые обновляются, и я думал, что работаю над кодом редактирования, но на самом деле я работал с формой вставки. Что объясняет его. Это от работы поздно ночью и усталости. Спасибо всем. @GhostGambler был первым, кто прокомментировал это, поэтому, пожалуйста, опубликуйте решение, и я выберу вас, сэр. Но спасибо AT-Nick и всем остальным за то, что они тоже были там. Я люблю это сообщество. :-) Код формы вставки еще не был преобразован в подготовленные операторы. Я делаю это сейчас.
@NormanBird Неважно, рад, что смог помочь
Имейте в виду, что переполнение стека не для «решений». Это ответы на вопросы. Ваш вопрос: «PDO не обрабатывает апостроф», на который у вас уже есть ответ: PDO делает обрабатывает все, что должен. В то время как ваши собственные ляпы скорее не по теме этого сайта.






Это необходимо решить.
PDO делает обрабатывает апостроф, а также любой другой персонаж во входных данных, добавляемых в запрос через параметр.
Код, который вы разместили здесь, никогда выдаст такую ошибку.
Так что твоя проблема в другом. Возможно, вы используете другую версию этого кода, или у вас есть опечатка в вашем запросе, или что-то еще столь же глупое. С кем не бывает. Но вы должны быть тверды в своих знаниях. Если ваш запрос возвращает ошибку, вы должны исследовать эту ошибку, а не обвинять PHP в том, что он не делает то, что должен делать. Обычно так и есть. Так что проблема с вашей стороны и никто не может сказать какая именно. Вы можете сделать это только сами, усердно отлаживая свой код.
И здесь вы можете узнать, как это сделать. У меня есть статья, которая поможет вам сделать свой вопрос ответственный по переполнению стека или, что наиболее вероятно, найти проблему самостоятельно в процессе: Как отлаживать код PDO
Я обновил свой пост с фактическим сообщением об ошибке и информацией о моем сервере. Благодарю.
Единственное полезное дополнение, которое вы можете сделать, это MCVE полный, как показано в моей ссылке. Просто заглушка, как та, которую вы добавили к вопросу, не подойдет. Хотя большинство людей никогда не смогут понять эту идею, тем не менее, только полностью воспроизводимый код может помочь вам понять, что ваши предположения совершенно неверны.
Да, вы правы, вы ответили на мой вопрос. Решение, если это интересно другим, заключается в том, что я ошибся и смотрел на неправильный код, который НЕ был подготовленными операторами. Живи и учись. Спасибо добрый сэр, и всем, кто видел то, чего не видел я. Благослови поет
Какую именно ошибку вы получаете?