MySQL 语法错误 1064,带有 PDO UPDATE 语句(带有命名或未命名占位符)返回 WSOD
Posted
技术标签:
【中文标题】MySQL 语法错误 1064,带有 PDO UPDATE 语句(带有命名或未命名占位符)返回 WSOD【英文标题】:MySQL syntax error 1064 with PDO UPDATE statement (with named or unnamed placeholders) returning WSOD 【发布时间】:2015-05-13 16:55:46 【问题描述】:我很清楚收到 #1064 错误指向无效的 mysql 语法这一事实,但我发现自己所处的情况并没有通过不断地前往 Manual-land 或仔细阅读 SO(特别是 PDO wiki 以及大量相关问题)和谷歌过去五天。问题在于这个 PDO UPDATE 语句;$stm = $pdo->prepare( "UPDATE articles SET title=?, article_text=?, category=? WHERE article_id=? AND user_id=?" );
当我在实时服务器上的 PMA 工作台上运行此语句(只是 UPDATE 部分)时,它返回 1064 - 只有通过单引号 ('
) 未命名占位符 (COMPLETELY错误!)。同样,无论我是 bindParam/bindValue 还是通过将参数传递给 execute
懒惰地绑定,我总是返回 WSOD。即使我尝试使用 '
包围的未命名占位符 execute
,也没有报告任何错误(更改为命名占位符,但结果仍然相同)。
我为两个 PDO 启用了错误检查(在我的 db.php
文件中 - 包含在查询页面的顶部) - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
(在 $options 数组中)
和 PHP -
`ini_set('display_startup_errors',1);
ini_set('display_errors',1);
error_reporting(-1);`
之所以如此令人烦恼,是因为它以当前使用的查询(每次运行都有效)为模型,该查询位于托管我的域的同一实时服务器上。我使查询尽可能简单,但我似乎无法超越查询对数据库的非更新以及浏览器的持续空白输出。在这一点上我很想使用ON DUPLICATE KEY UPDATE
,但是当没有可以想象的原因为什么这个简单的 PDO 更新不会添加我的编辑信息时,我为什么要这样发疯呢?以下是我试图达到的WSOD;
第一次尝试(原始查询模型)
if($action == 'save changes')
$sql = "UPDATE articles SET title=?, article_text=?, category=? WHERE article_id=?";
$q = $pdo->prepare($sql);
$q->execute(array($title,$article_text,$category,$article_id));
//If successful, redirect
if($sql)
header('Location: pending.php');exit;
else
echo '<a href="javascript: history.go(-1)"><font color="#0000CC" face="arial black">No record added. Return to form, please!</font></a>';
结果? WSOD
第二次尝试(使用 bindParam)
if($action == 'save changes')
$stmt = $pdo->prepare('UPDATE articles SET title = :title, article_text = :article_text, `category` = :category, WHERE article_id = :article_id');
$stmt->bindParam(':title', $title, PDO_PARAM_STR);
$stmt->bindParam(':article_text', $article_text, PDO_PARAM_STR);
$stmt->bindParam(':category', $category, PDO_PARAM_STR);
$stmt->bindParam(':article_id', $article_id, PDO_PARAM_INT);
return $stmt->execute();`
结果? WSOD
对于任何想知道的人,所有使用的变量都是在使用之前直接声明的(消除所有潜在的Undefined Index
错误)。我在几次连续的尝试中做了一些调整,但我无法超越这个症结所在。我仍然对 PMA 让我使用单引号未命名占位符运行查询感到震惊。无论如何,我仍然遇到错误信息所说的语法错误,它在等号(UPDATE
articlesSET
title`=)之后开始。我做错了什么或错过了什么?感谢任何人可以通过链接或理论提供的任何启发,这将帮助我理解这种情况以解决这个奇怪的问题。如果需要,将提供被认为与此问题相关的任何其他信息。
【问题讨论】:
您缺少报价。"UPDATE articles SET title=?, article_text=?, category=? WHERE article_id=?;
- 编辑:那么你可能会转身说这是一个错字。
@Fred-ii- - 感谢您对发现我的发布错误的快速响应,是的,这是一个错字,因为 UPDATE 语句在我的 Notepad++ 中被括号包围 - 正在几秒钟内进行编辑。再次感谢您的光临。
请注意,@Fred-ii-,- 这绝对是我的人为错误 - 再次感谢您。
即使引用了更正 - 返回并从上到下检查文档以消除任何人为错误 - 我仍然得到相同的结果。
是的,我有但无法提供解决方案,抱歉。
【参考方案1】:
经过无数次的调整,我终于能够达到我想要的目标;
$article_id = (isset($_POST['article_id'])) ? $_POST['article_id'] : '';
$title = (isset($_POST['title'])) ? $_POST['title'] : '';
$article_text = (isset($_POST['article_text'])) ? $_POST['article_text'] : '';
$category = (isset($_POST['category'])) ? $_POST['category'] : '';
$sql = 'UPDATE `articles` SET `title`=?, `article_text`=?, `category`=? WHERE `article_id`=?';
$q = $pdo->prepare($sql);
$q->execute(array($title,$article_text,$category,$article_id));
//If successful redirect to display database update details
if($sql)
header('Location: view_article.php?id='.intval($_POST['article_id']));
exit;
else
echo '<a href="javascript: history.go(-1)"><font color="#0000CC" face="arial black">No record added. Return to form, please!</font></a>';
break;
很高兴地报告,在发布此答案时,连续尝试了 3 次并获得了预期的结果。现在可以直接将成员带到他们的内容更新视图。我知道这不可能那困难。就执行流程而言,只需要重新排列一些代码。我实际上开始喜欢使用 PDO。
重要编辑
我的问题的症结在于我如何让 $action
变量运行 - 在我的编辑表单中,它实际上被降级为隐藏输入。一旦我决定将变量属性实际移动到提交按钮;<input type="submit" name="action" value="Save Changes" />
THEN 一切都到位并允许数据库轻松更新。再一次,这是人为错误如何导致不想要的和意外的代码结果的一个典型例子(哈哈!)。
【讨论】:
以上是关于MySQL 语法错误 1064,带有 PDO UPDATE 语句(带有命名或未命名占位符)返回 WSOD的主要内容,如果未能解决你的问题,请参考以下文章
SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误 — PHP — PDO [重复]