2011-03-03 50 views
3

我有如下表:mysqli的INSERT异常

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; 
} 

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

+0

作为一个侧面说明,你可以有SQL服务器执行,而不是采取额外的'NOW()'函数在你的PHP一步。 – 2011-03-03 10:50:13

+0

对不起,这里的错字。刚纠正它。 – Laraveldeep 2011-03-03 10:53:41

回答

2

如何在$query内更换DESCTIPTIONDESCRIPTION

编辑

只是出于好奇,我创建了一个表中调用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(); 
} 
+0

对不起,在 – Laraveldeep 2011-03-03 11:06:32

+0

后的错字是的,我有一个单独的config.php文件。刚刚重新复习,罚款。使用error_reporting(E_ALL);并没有显示任何错误。 – Laraveldeep 2011-03-03 11:56:18

+0

谢谢!此代码现在可用。我按照建议尝试了CURDATE(),并绑定了其他参数。它现在有效。再次感谢。 – Laraveldeep 2011-03-03 12:13:12

2

你确定没有错误吗?例如,列名似乎存在拼写错误。

请注意,PDO是非常默认情况下有关错误的秘密。

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

+0

错字仅在此处发布。我真正的问题很好。对不起。我只是纠正它。我正在使用** mysqli **不是** PDO ** – Laraveldeep 2011-03-03 10:50:53

+0

@Deepak啊,我明白了。抱歉。点仍然站在:无效的查询不会抛出异常 – 2011-03-03 10:51:25

2

尝试编写本查询,而不是:

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

,并检查$stmt->execute()结果。它会给你一个警告,"CUR_DATE()"(原文如此)不是一个有效的DATE

您可以检查,如果语句正确通过检查​​返回值和查询errorInfo()方法执行:

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

要知道,在出现故障时,​​不抛出异常自动的。你必须检查自己是否成功运行和失败。

+0

刚刚尝试过。似乎有错误。它不重定向,但没有显示错误。是不是我的catch例外应该吐出错误?任何想法?谢谢 – Laraveldeep 2011-03-03 11:06:05

+0

@Deepak看我的编辑。 – 2011-03-03 11:27:22

+0

我只是检查这个代码,并得到'object(mysqli_stmt)#2(0){}'。这是什么?看起来像CURDATE()与此有关。任何想法?谢谢你的时间。 – Laraveldeep 2011-03-03 11:56:50

0

是否有可能关闭自动提交?

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

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

问候

+0

尝试过,但它仍然显示成功,但没有表中的条目。有什么想法吗? – Laraveldeep 2011-03-03 11:02:26