10

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

  $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 服务器上,它停止工作......

并且查询功能完美运行...查询确定,插入否

编辑:谢谢大家!真的!

4

4 回答 4

31

您需要告诉 PDO 引发错误

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

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

于 2013-01-23T16:57:25.420 回答
4

您没有充分利用 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 );  
于 2013-01-23T16:58:11.570 回答
0

如果代码在 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 扩展工作

于 2013-01-23T17:02:10.593 回答
0

我有一个类似的问题,原来是因为我没有为 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

于 2014-10-15T22:30:32.133 回答