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

MySQL syntax error 1064 with PDO UPDATE statement (with named or unnamed placeholders) returning WSOD

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

当我在我的实时服务器上的 PMA workbench 上 运行 这条语句(只是更新部分)时,它 returns 1064 - 这只能通过 single- 成功解决引用(')未命名的占位符(完全错误!)。同样,无论我是 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 让我 运行 使用单引号未命名占位符的查询。无论如何,我仍然遇到错误信息所说的语法错误,它在等号之后开始( 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 次并获得了预期的结果。现在可以直接将成员带到他们的内容更新视图中。我知道这不会那么难。就执行流程而言,只需重新安排一些代码。我实际上开始喜欢使用 PDO。

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