Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO即使在使用准备好的语句时也不处理字段数据中的撇号_Php_Mysql_Pdo - Fatal编程技术网

Php PDO即使在使用准备好的语句时也不处理字段数据中的撇号

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=

我的印象是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= ?, 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,如我的链接所示。只是像你在问题上加的一样,是不行的。虽然大多数人永远无法理解这个想法,但是,只有完整的可复制代码才能帮助您认识到您的假设是完全错误的。是的,您是正确的,您回答了我的问题。如果其他人感兴趣的话,解决方法是我犯了一个错误,并且看到了错误的代码,而这些代码不是预先准备好的语句。生活和学习。谢谢你,好心的先生,还有所有看到我没有看到的东西的人。祝福歌唱