【问题标题】:PDO - Update is not workingPDO - 更新不起作用
【发布时间】:2015-11-21 15:19:57
【问题描述】:

有人知道为什么这不起作用吗?

$sql = $dbh->prepare('UPDATE notes SET title=:title, content=:content WHERE id=:id');
$title = $_POST['title'];
$content = $_POST['editor_edit'];
$id = $r2['id'];
$sql->bindValue(':title',$title);
$sql->bindValue(':content',$content);
$sql->bindValue(':id',$id);
$sql->execute();

我尝试在没有 bindValue 的情况下做同样的事情,但是将内容直接放入执行命令中,但这是行不通的。当我尝试将简单的值放入语句(如'UPDATE notes SET title="test", content="hello" WHERE id=20')时,它起作用了,因此与数据库的连接正常。有人看出错误了吗?

【问题讨论】:

  • 这是什么意思它不工作?有什么错误?
  • 和@bub 说的一样,你得到了什么错误?
  • 我没有收到任何错误......
  • 如果您没有收到任何错误,这可能不是语法问题 - 可能只是 $r2['id'] 中的值实际上与表中任何记录的 id 不匹配 - 尝试:var_dump($r2['id']) 看看它到底有什么。
  • 我认为更新语法不正确,请检查您的更新语法。 SET title =:标题,content =:内容

标签: php mysql pdo sql-update


【解决方案1】:

$r2['id']; 行可能正在返回一个字符串。因此,$id 将持有一个字符串值。你的 id 是 int 所以,把它转换成 int 像:

$id = $r2['id'];
$id = intval($id);

【讨论】:

    【解决方案2】:

    您正在使用 PDO,并且您使用简单值测试了查询并且它正在工作。这意味着问题发生在参数绑定问题上。

    因此,您希望看到 SQL 查询 PDO 在绑定所有参数后生成,但您不知道如何操作。您需要找到一种方法来执行此操作,否则您最终会在此处就每个不起作用的查询寻求帮助,因为您不知道 PDO 实际生成的是什么。

    有两种方法可以做到这一点(我假设您使用的是 WAMP,但您也可以调整它以在 LAMP 上工作):

    方法一:我们可以将 MySQL 运行的每个查询捕获到 mysql.general_log 表中。通过运行以下命令:

    SET GLOBAL general_log = 'ON';

    SET GLOBAL log_output = 'TABLE';

    从 mysql.general_log 表中获取与特定用户/应用相关的输出:

    SELECT * FROM mysql.general_log WHEREuser_hostNOT LIKE "%root%" ORDER BY event_time DESC

    SELECT * FROM mysql.general_log WHEREuser_hostLIKE "%username%" ORDER BY event_time DESC

    方法二:在WAMP中编辑my.ini文件查看sql查询日志

    [wampmysqld]
    general-log=1
    general-log-file=c:/mysql_general.log
    

    另外,像这样设置你的连接以获得 PREPARE faze 和 EXECUTE faze 引发的错误:

    try{
        $db = new PDO('mysql:host=localhost;dbname=dbname', "username" , "password");
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
    
    }catch(PDOException $e){
        print "error in connection" . $e->getMessage();
    }
    

    【讨论】:

    • 为什么这被否决了?如果原发帖人使用这个,他很容易就能看出问题出在哪里。另外,他将来需要这个,我从经验中知道看不到 PDO 生成的最终 sql 查询是多么令人沮丧。
    【解决方案3】:

    对于数据库连接,试试这些代码。如果有任何错误,这些代码将显示任何错误

    database.php

       <?php
    try{
        $db = new PDO('mysql:host=localhost;dbname=your database name', "root" , "");
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    }catch(PDOException $e){
        print "error in connection" . $e->getMessage();
    }
    

    为了更新..试试这些代码

        <?php
    require_once 'database.php';
    
    $title = $_POST['title'];
    $content = $_POST['editor_edit'];
    $id = $r2['id'];
    
        $stmt = $db->prepare("UPDATE notes SET title  = ?, content =? WHERE id = ?");
        $stmt->execute(array($title,$content,$id));
        echo "updated Successfully";
    

    希望对你有帮助!!

    【讨论】:

      【解决方案4】:

      您没有收到任何错误,因为您没有在寻找任何错误!

      试试这个包含一些错误处理,它可能会抛出一个错误,所以你可以自己修复它。

      if ( ! isset( $_POST['title'],$_POST['editor_edit'], $r2['id']) ) {
          echo 'Parameters Missing';
          exit;
      }
      
      $title = $_POST['title'];
      $content = $_POST['editor_edit'];
      $id = $r2['id'];
      
      $stmt = $dbh->prepare('UPDATE notes SET title=:title, content=:content WHERE id=:id');
      if ( ! $stmt ) {
          print_r( $dbh->errorInfo() );
      }
      
      $stmt->bindValue(':title',$title, PDO::PARAM_STR);
      $stmt->bindValue(':content',$content, PDO::PARAM_STR);
      $stmt->bindValue(':id',$id, PDO::PARAM_INT);
      $result = $stmt->execute();
      if ( ! $result ) {
          print_r( $stmt->errorInfo() );
          exit;
      }
      

      【讨论】:

        猜你喜欢
        • 2016-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-04
        • 2017-09-27
        • 2014-07-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多