【问题标题】:PDO not inserting - no error [duplicate]PDO 未插入 - 没有错误 [重复]
【发布时间】:2013-01-07 05:56:44
【问题描述】:

我不明白为什么这些行不起作用:

  $host = 'localhost';
  $dbname='mydbname';
  $login='mylogin';
  $pwd='mypwd';
  $datex = date('Y/m/d H:i:s');
  $nomx = 'jrmy';
  $numx = '007';
  try {
    $bdd = new PDO('mysql:host='.$host.';dbname='.$dbname, $login, $pwd);
  }
  catch(Exception $e) {
    die('Erreur : '.$e->getMessage());
  }
  $bdd->exec('INSERT INTO dossiers(date, nom, numero, disp) VALUES(\''.$datex.'\', \''.$nomx.'\', \''.$numx.'\', \'Y\')');
  $id = $bdd->lastInsertId();
  $bdd= null;
  echo 'id: '.$id;

披露:该脚本在我的 apache 服务器上运行,由于我将脚本安装在 IIS 服务器上,它停止运行...

查询功能完美运行...查询OK,插入NO

编辑:谢谢大家!真的!

【问题讨论】:

  • 将值连接到查询中完全违背了准备语句的目的。
  • @AustinBrunkhorst 他没有使用准备好的语句,而是直接执行查询。
  • “这种柴油在我的拖拉机上工作得很好,但是我把它放在我的车里后发动机就不能启动了?”打开error_reporting,看看你是否收到关于缺少扩展的错误。此外,将您的 exec 包装在 if 语句中,看看它是否真的成功。
  • 在 MySQL 中使用date 作为列名不是一个好习惯。
  • 您没有做任何事情来尝试检查您的查询尝试是否有错误。我建议从那里开始。此外,您可能希望通过在查询字符串周围使用双引号使您在编写查询时更轻松,这样您就不必转义所有单引号。您还应该考虑使用@AustinBrunkhorst 建议的准备好的语句。

标签: php mysql database pdo


【解决方案1】:

您需要告诉 PDO 引发错误

$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

请注意,您处理异常的方式毫无用处。最好从代码中删除 try-catch 块

【讨论】:

  • 我的问题是:我的数据库中没有 1 列的默认值 - 这不是我以前的配置的问题,现在会引发错误
  • 我真的开始讨厌 PDO
  • @jimsmith 我同意,有趣的是,当 PDO 从头开始​​设计以替换主要的 mysql_ 功能时,它出现了多少问题。默认情况下不引发任何错误是一个非凡的决定。
  • 问题是“未选择数据库”
【解决方案2】:

您没有充分利用 PDO。使用参数插入数据

例子:

$bdd->exec('INSERT INTO dossiers(date, nom, numero, disp) VALUES(?, ?,?, ?)');
$bdd->bindParam(1, $datex);  
$bdd->bindParam(2, $nomx);  
$bdd->bindParam(3, $numx);
$bdd->bindParam(3, 'Y');

并使用它来引发错误:

$bdd>setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  

【讨论】:

    【解决方案3】:

    如果代码在 Apache 中正常运行,但在 IIS 中停止运行,则可能是环境更改导致了它,而代码中没有任何内容。您是否检查过 Windows 中的 PDO 扩展是否已启用?

    这些是 Windows 的主要四个 PDO dll:

    extension=php_pdo.dll
    extension=php_pdo_mysql.dll
    extension=php_pdo_mssql.dll
    extension=php_pdo_odbc.dll
    

    我认为前两个需要在您的 php.ini 中启用才能使 PDO 扩展工作

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题,原来是因为我没有为 PDO 启用自动提交。使用显式事务帮助我解决了问题;

      self::$_pdo->beginTransaction();
      $sql = "INSERT INTO redirects (source, target, http_status_code, aspect_id) VALUES(?, ?, ?, ?)";
      $query = self::$_pdo->prepare($sql);
      $query->execute(array($_POST['source'], $_POST['target'], $_POST['http_status_code'], $_POST['aspect_id']));
      self::$_pdo->commit();
      

      (是的,有一百万种方法可以更好地完成上述操作,但我只是在演示交易。在这里,请阅读:http://php.net/manual/en/pdo.transactions.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-13
        • 2021-03-22
        • 2019-09-21
        • 2015-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多