PDO не обрабатывает апостроф в данных поля даже при использовании подготовленных операторов

У меня сложилось впечатление, что подготовленные операторы 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

Какую именно ошибку вы получаете?

Nick 13.05.2019 05:25

Обычное «в вашем операторе mysql есть ошибка рядом с« riley .. », что указывает на то, что mysql отклонил синтаксис оператора прямо в апостифе. Я опубликую актуальную ошибку утром.

Norman Bird 13.05.2019 05:34

Вероятно, было бы полезно также опубликовать имя поля и тип данных, с которыми у вас возникли проблемы.

Nick 13.05.2019 05:37

какие версии вы используете? особенно php, pdo, mysql-драйверы и mysql-сервер? мое первое предположение было бы устаревшей версией с ошибками, а второе - проблемой конфигурации. потому что эта ошибка может произойти только в том случае, если фактические подготовленные операторы недоступны, и PDO должен эмулировать

Franz Gleichmann 13.05.2019 07:24

@FranzGleichmann, даже если PDO должен эмулировать, очевидно такая ошибка никогда не произойдет.

Your Common Sense 13.05.2019 09:44

@Nick и AT-FranzGleichman, я обновил свой пост сообщением об ошибке и информацией о моем локальном сервере. Я согласен, что этого не должно происходить, поскольку я использую подготовленные операторы, но, увы, мы здесь.

Norman Bird 13.05.2019 14:49

Запрос в сообщении об ошибке не соответствует вашему коду. (ОБНОВЛЕНИЕ против ВСТАВКИ)

Ulrich Thomas Gabor 13.05.2019 14:49

Как указывает @GhostGambler, ошибка возникает из-за другого запроса. Возможно, что INSERT готовится нет?

Nick 13.05.2019 14:53

ДУХ! Это оно! У меня есть prosses-new-project.php и process-edit-project.php, которые обновляются, и я думал, что работаю над кодом редактирования, но на самом деле я работал с формой вставки. Что объясняет его. Это от работы поздно ночью и усталости. Спасибо всем. @GhostGambler был первым, кто прокомментировал это, поэтому, пожалуйста, опубликуйте решение, и я выберу вас, сэр. Но спасибо AT-Nick и всем остальным за то, что они тоже были там. Я люблю это сообщество. :-) Код формы вставки еще не был преобразован в подготовленные операторы. Я делаю это сейчас.

Norman Bird 13.05.2019 15:00

@NormanBird Неважно, рад, что смог помочь

Ulrich Thomas Gabor 13.05.2019 15:12

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

Your Common Sense 13.05.2019 15:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
11
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это необходимо решить.

PDO делает обрабатывает апостроф, а также любой другой персонаж во входных данных, добавляемых в запрос через параметр.

Код, который вы разместили здесь, никогда выдаст такую ​​ошибку.

Так что твоя проблема в другом. Возможно, вы используете другую версию этого кода, или у вас есть опечатка в вашем запросе, или что-то еще столь же глупое. С кем не бывает. Но вы должны быть тверды в своих знаниях. Если ваш запрос возвращает ошибку, вы должны исследовать эту ошибку, а не обвинять PHP в том, что он не делает то, что должен делать. Обычно так и есть. Так что проблема с вашей стороны и никто не может сказать какая именно. Вы можете сделать это только сами, усердно отлаживая свой код.

И здесь вы можете узнать, как это сделать. У меня есть статья, которая поможет вам сделать свой вопрос ответственный по переполнению стека или, что наиболее вероятно, найти проблему самостоятельно в процессе: Как отлаживать код PDO

Я обновил свой пост с фактическим сообщением об ошибке и информацией о моем сервере. Благодарю.

Norman Bird 13.05.2019 14:50

Единственное полезное дополнение, которое вы можете сделать, это MCVE полный, как показано в моей ссылке. Просто заглушка, как та, которую вы добавили к вопросу, не подойдет. Хотя большинство людей никогда не смогут понять эту идею, тем не менее, только полностью воспроизводимый код может помочь вам понять, что ваши предположения совершенно неверны.

Your Common Sense 13.05.2019 14:57

Да, вы правы, вы ответили на мой вопрос. Решение, если это интересно другим, заключается в том, что я ошибся и смотрел на неправильный код, который НЕ был подготовленными операторами. Живи и учись. Спасибо добрый сэр, и всем, кто видел то, чего не видел я. Благослови поет

Norman Bird 13.05.2019 15:44

Другие вопросы по теме