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

时间:2015-05-13 16:55:46

标签: php mysql pdo

我很清楚收到#1064错误指向无效的MySQL语法这一事实,但我发现自己的情况还没有通过不断的手动登陆或者细读来解决。过去五天都是SO(特别是PDO维基以及大量相关问题)和谷歌。问题是这个PDO UPDATE语句;
    $stm = $pdo->prepare( "UPDATE articles SET title=?, article_text=?, category=? WHERE article_id=? AND user_id=?" );

当我在我的实时服务器上的PMA工作台上运行此语句(只是UPDATE部分)时,它返回1064 - 只能通过单引号(')成功解析未命名的占位符(完全错误!)。同样,无论我是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>';  
           }}

RESULT? 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();`  
  }

RESULT? WSOD

对于任何想知道的人来说,所有使用的变量都是在使用之前直接声明的(消除了所有潜在的Undefined Index错误)。我在几次连续尝试中做了一些调整,但我还没能超越这个难点。我仍然有点惊讶PMA允许我使用单引号的未命名占位符运行查询。无论如何,我仍然使用语法错误,错误信息表示在等号(UPDATE文章SET title` =)之后开始。我做错了什么或错过了什么?感谢任何人都可以通过链接或理论提供的任何启示,帮助我理解这种情况,以解决这个奇怪的问题。如果需要,将提供被认为与此问题相关的任何其他信息。

1 个答案:

答案 0 :(得分:0)

经过无数的调整后,我终于能够达到我想要的目标;

^[A-Z]:?\d+(GB|gb),( [A-Z]:?\d+(GB|gb)){2}$

很高兴报告在发布此答案时,连续3次尝试了所需的结果。该成员现在可以直接进入其内容更新的视图。我知道它不能那么困难。只需重新安排一些代码就执行流程而言。我实际上开始喜欢与PDO合作。

重要编辑 我的问题的症结与我如何操作 $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; 变量有关 - 在我的编辑表单中,它实际上被归为隐藏输入。一旦我决定将变量属性实际移动到提交按钮;
$action
那么一切都已落实到位,让数据库可以毫不费力地更新。再次,人为错误如何导致不必要的和意外的代码结果的一个主要例子(哈哈!)。