Php PDO即使在使用准备好的语句时也不处理字段数据中的撇号
我的印象是PDO的预处理语句也做了旧的MYSQL_REAL_ESCAPE_字符串所做的事情Php PDO即使在使用准备好的语句时也不处理字段数据中的撇号,php,mysql,pdo,Php,Mysql,Pdo,我的印象是PDO的预处理语句也做了旧的MYSQL_REAL_ESCAPE_字符串所做的事情 $updatesql = "UPDATE projects SET title= ?, project_status= ?, bpm= ?, genre= ?, release_genre= ?, vocals= ?, lyrics_written= ?, voice_of= ?, start_date= ?, finish_date= ?, project_time= ?, file_name=
$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_字符串,因为它需要一个mysqli连接作为第一个参数,而Im使用PDO
唯一的解决方案是对所有my DB插入使用addslashes,然后对所有my display数据字段使用stripslashes吗?这似乎是我们10年前才会做的事情。当使用PDO准备的语句时,我遗漏了什么,因为它与处理撇号等的最佳实践有关
更新:
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
我的本地环境/服务器信息如下:
服务器:通过UNIX套接字的本地主机
服务器类型:MySQL
服务器版本:5.7.26-0ubuntu0.18.04.1-(Ubuntu)
协议版本:10
用户:root@localhost
服务器字符集:UTF-8 Unicode(utf8)
Apache/2.4.29(Ubuntu)
数据库客户端版本:libmysql-mysqlnd 5.0.12-dev-20150407-$Id:3591daad22de08524295e1bd073aceeff11e6579$
PHP扩展:mysqlidDocumentation 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
这需要解决 PDO不处理撇号,以及通过参数添加到查询的输入数据中的任何其他字符 您在此处发布的代码将不会产生这样的错误 所以你的问题在别处。您可能正在运行此代码的另一个版本,或者您的查询中有一些输入错误或其他愚蠢的事情。每个人都会这样。但你必须坚定你的知识。如果您的查询返回错误,那么您必须调查这个错误,而不是责怪PHP没有做它应该做的事情。通常是这样。所以问题就在你这方面,没有人能告诉你是哪一个。通过勤奋地调试代码,您只能自己调试它
在这里你可以学习如何做到这一点。我有一篇文章可以帮助您解决堆栈溢出问题,或者(很可能)在过程中自己发现问题:这需要解决 PDO不处理撇号,以及通过参数添加到查询的输入数据中的任何其他字符 您在此处发布的代码将不会产生这样的错误 所以你的问题在别处。您可能正在运行此代码的另一个版本,或者您的查询中有一些输入错误或其他愚蠢的事情。每个人都会这样。但你必须坚定你的知识。如果您的查询返回错误,那么您必须调查这个错误,而不是责怪PHP没有做它应该做的事情。通常是这样。所以问题就在你这方面,没有人能告诉你是哪一个。通过勤奋地调试代码,您只能自己调试它
在这里你可以学习如何做到这一点。我有一篇文章可以帮助你在堆栈溢出时回答问题,或者——很可能——在这个过程中自己发现问题:你到底得到了什么错误?通常的“你的mysql语句在‘riley..附近有一个错误”,这表示mysql在撇号时就拒绝了语句语法。我会在早上发布实际错误。同时发布您遇到问题的字段名和数据类型可能会有所帮助。错误消息中的查询不是您的代码。(更新vs插入)正如@GhostGambler指出的,错误来自另一个查询。也许,
INSERT
没有准备好?您到底得到了什么错误?通常的“在'riley..附近的mysql语句中有一个错误”,这表示mysql在撇号处拒绝了语句语法。我会在早上发布实际错误。同时发布您遇到问题的字段名和数据类型可能会有所帮助。错误消息中的查询不是您的代码。(更新vs插入)正如@GhostGambler指出的,错误来自另一个查询。也许,INSERT
没有准备好?我已经用实际的错误消息和我的服务器信息更新了我的帖子。谢谢。你能做的唯一有用的补充就是完整的MCVE,如我的链接所示。只是像你在问题上加的一样,是不行的。虽然大多数人永远无法理解这个想法,但是,只有完整的可复制代码才能帮助您认识到您的假设是完全错误的。是的,您是正确的,您回答了我的问题。如果其他人感兴趣的话,解决方法是我犯了一个错误,并且看到了错误的代码,而这些代码不是预先准备好的语句。生活和学习。谢谢你,好心的先生,还有所有看到我没有看到的东西的人。我已经用实际的错误信息和我的服务器信息更新了我的帖子。谢谢。你能做的唯一有用的补充就是完整的MCVE,如我的链接所示。只是像你在问题上加的一样,是不行的。虽然大多数人永远无法理解这个想法,但是,只有完整的可复制代码才能帮助您认识到您的假设是完全错误的。是的,您是正确的,您回答了我的问题。如果其他人感兴趣的话,解决方法是我犯了一个错误,并且看到了错误的代码,而这些代码不是预先准备好的语句。生活和学习。谢谢你,好心的先生,还有所有看到我没有看到的东西的人。祝福歌唱