gpt4 book ai didi

php - MySQL 语法错误 1064,PDO UPDATE 语句(带有命名或未命名占位符)返回 WSOD

转载 作者:行者123 更新时间:2023-11-30 22:43:53 25 4
gpt4 key购买 nike

我很清楚收到 #1064 错误指向无效的 MySQL 语法这一事实,但我发现自己所处的情况并没有通过不断前往 Manual-land 或仔细阅读 SO(the特别是 PDO wiki 以及大量相关问题)和谷歌最近五天。问题在于此 PDO 更新语句;
$stm = $pdo->prepare( "UPDATE articles SET title=?, article_text=?, category=? WHERE article_id=? AND user_id=?");

当我在实时服务器上的 PMA 工作台上运行此语句(只是更新部分)时,它返回 1064 - 只有通过单引号 (') 未命名的占位符才能成功解析(完全错误!)。同样,无论我是 bindParam/bindValue 还是通过将参数传递给 execute 进行延迟绑定(bind),我总是返回 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 让我使用单引号未命名占位符运行查询感到震惊。无论如何,我仍然遇到错误信息所说的语法错误,它在等号之后开始(UPDATEarticlesSETtitle`=)。我做错了什么或错过了什么?感谢任何人都可以通过链接或理论提供的任何启发,这将帮助我理解这种情况,从而解决这个奇怪的问题。如果需要,将提供任何其他被认为与该问题相关的信息。

最佳答案

经过无数次的调整,我终于达到了我想要的目标;

    $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 次并获得了预期的结果。现在可以直接将成员带到他们的内容更新 View 中。我知道这不会那么困难。就执行流程而言,只需重新安排一些代码。我实际上开始喜欢使用 PDO。

重要修改我的问题的关键与我如何拥有 $action 有关。变量操作 - 在我的编辑表单中,它实际上被归类为隐藏输入。一旦我决定实际将变量属性移动到提交按钮;
<input type="submit" name="action" value="Save Changes" />
THEN 一切就绪,让数据库毫不费力地更新。这又是一个典型的例子,说明人为错误如何导致不需要的和意外的代码结果(哈哈!)。

关于php - MySQL 语法错误 1064,PDO UPDATE 语句(带有命名或未命名占位符)返回 WSOD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30220979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com