【问题标题】:mysqli INSERT anomalymysqli INSERT异常
【发布时间】:2011-07-07 23:15:57
【问题描述】:

我有下表:

ID: bigint autoinc
NAME: varchar(255)
DESCRIPTION: text
ENTRYDATE: date

我正在尝试在表格中插入一行。它执行没有错误,但没有任何内容插入数据库中。

try {
    $query = "INSERT INTO mytable (NAME, DESCRIPTION, ENTRYDATE) VALUES(?,?,?)";
    $stmt = $conn->prepare($query);
    $name= 'something';
    $desc = 'something';
    $curdate = "CURDATE()";
    $stmt->bind_param("sss", $name, $desc, $curdate);
    $stmt->execute();
    $stmt->close();
    $conn->close();
    //redirect to success page
}
catch(Exception $e) {
    print $e;
}

它运行良好并重定向到成功页面,但在表格中找不到任何内容。为什么它不起作用?

【问题讨论】:

  • 附带说明,您可以让 SQL 服务器执行 NOW() 函数,而不是在您的 php 中采取额外的步骤。
  • 抱歉这里的错字。刚刚更正了。

标签: php insert mysqli row


【解决方案1】:

$query 中用DESCRIPTION 替换DESCTIPTION 怎么样?

编辑

出于好奇,我创建了一个名为 mytable 的表,并将您的代码复制粘贴到 PHP 脚本中。

这里一切正常并插入了行,除了绑定参数CURDATE() 没有正确执行并且ENTRYDATE 单元被分配0000-00-00

您确定您正在监控您的脚本应该插入的同一个数据库和表吗?

使用error_reporting(E_ALL); 会发生什么?

您是否验证过脚本确实完成了插入?

以下似乎按预期工作:

error_reporting(E_ALL);

try {
    $query = "INSERT INTO mytable (NAME, DESCRIPTION, ENTRYDATE) VALUES (?, ?, CURDATE())";
    $stmt = $conn->prepare($query);
    $name= 'something';
    $desc = 'something';
    $stmt->bind_param("ss", $name, $desc);
    $stmt->execute();

     if ($conn->affected_rows < 1) {
        throw new Exception('Nothing was inserted!');
     }

    $stmt->close();
    $conn->close();
    //redirect to success page
}
catch(Exception $e) {
    print $e->getMessage();
}

【讨论】:

  • 是的,我有一个单独的 config.php 文件。刚刚recheked和它的罚款。错误报告(E_ALL);仍然没有显示任何错误。
  • 谢谢!这段代码现在有效。我按照建议尝试了 CURDATE() 并绑定了其他参数。现在可以了。再次感谢。
【解决方案2】:

你确定没有错误吗?例如,您的列名中似乎有错字。

请注意,PDO 默认情况下非常对错误保密。

请参阅How to squeeze error message out of PDO? 了解如何解决此问题。

【讨论】:

  • 错字仅在这篇文章中出现。我的真实查询很好。对此感到抱歉。我刚刚纠正了它。我使用的是 mysqli 而不是 PDO
  • @Deepak 啊,我明白了。对不起。重点仍然存在:无效查询不会引发异常
【解决方案3】:

尝试准备此查询:

"INSERT INTO mytable (NAME, DESCRIPTION, ENTRYDATE) VALUES(?,?,CUR_DATE())"

并检查$stmt-&gt;execute() 的结果。它会警告您"CUR_DATE()"(原文如此)不是有效的DATE

您可以通过检查execute()的返回值并查询errorInfo()方法来检查语句是否正确执行:

if (!$stmt->execute()) {
   throw new Exception($stmt->errorInfo(), stmt->errorCode());
}

请注意,在失败时,execute() 不会自动抛出异常。您必须自己检查操作是否成功。

【讨论】:

  • 刚试过。似乎有错误。它不会重定向,但不会显示错误。我的catch异常不是应该吐出错误吗?任何想法?谢谢
  • 我只是检查了这段代码并得到了'object(mysqli_stmt)#2(0){}'。这是什么?似乎 CURDATE() 与此有关。任何想法?感谢您的宝贵时间。
【解决方案4】:

自动提交是否可能关闭?

如果是这样,那么您必须像这样提交插入

/* commit transaction */
$conn->commit();

问候

【讨论】:

  • 试过了,但它仍然显示成功,但表中没有条目。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 2013-09-19
  • 2013-08-25
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
相关资源
最近更新 更多