mysql没有INSERT

时间:2013-07-30 09:26:02

标签: php mysql mysqli xampp

我试图将表单中的数据(通过POST)插入到MySQL数据库中,它不会显示任何错误,但是当我在phpMyAdmin中检查它时它不会显示。

    <?php

    $amount = $_POST["amount"];
    $unit = $_POST["unit"];
    $date = date('Y-m-d H:i:s');

    $host = "localhost";
    $user = "root";
    $pass = "";
    $db = "finance";
    $table = "silver";

    $mysqli = new mysqli($host, $user, $pass, 'finance');

    if(!$mysqli)
       {
       echo "<div class=\"error\">";
       echo "No connection can be established";
       echo "</div>";
       die();
       } 

   if ($unit = "gram") $amount = $amount * 28.3495231;

   // create query
   $query = "INSERT INTO 'silver'.'finance' (
    'Transaction_Num',
    'dtStamp',
    'Amount'
   ) 
   VALUES (
   NULL, \'2013-07-03 06:18:16\', \'1\'
   );";

   // execute query
   $mysqli->query($query);
   ?>

我在XAMPP 1.8.2 w / PHP 5.4.16,Apache 2.4.4和 Windows XP上的MySQL 5.6.11。

2 个答案:

答案 0 :(得分:2)

不要在表和字段名称上使用单引号。这应该是反击。

试试这个:

   $query = "INSERT INTO `silver`.`finance` (
    `Transaction_Num`,
    `dtStamp`,
    `Amount`
   ) 
   VALUES (
   NULL, '2013-07-03 06:18:16', '1'
   );";

OR / AND如果Transaction_NumAUTO_INCREMENT,您可能不需要像以下那样插入:

$query = "INSERT INTO silver.finance (dtStamp,Amount) 
   VALUES ( '2013-07-03 06:18:16', 1);";

OR / AND如果dtStampDEFAULT = CURRENT_TIMESTAMP,则可能不需要插入,如:

$query = "INSERT INTO silver.finance (Amount) 
   VALUES (1);";

答案 1 :(得分:0)

你自己写的,“它没有显示任何错误”。通过如此广泛的分析,您需要记住一些事项(并列入您的清单)。

首先,PHP不会始终显示错误。它是否显示错误取决于您使用的错误配置。正如你没有在你的问题中显示的那样,很难说这是否是一个问题,但是,如果你遇到意想不到的事情(就像你一样),你首先应该检查报告错误的方式和位置。

解释整个PHP error configuration对于这里的答案来说太过分了,一个很好的资源(在已经详细记录了所有内容的手册旁边)我们在Stackoverflow网站上有这个:

然后你需要弄清楚是否存在Mysqli错误。让我们回顾一下事情可能出错的每一步。

连接:

  $mysqli = new mysqli($host, $user, $pass, 'finance');

使用错误的凭据实例化Mysqli确实会在PHP中出错。但是,mysqli对象将被实例化无论如何。这意味着变量$mysqli 总是 mysqli 类型的对象 - 无论连接是否成功。

由于PHP中的每个对象总是 松散地true ,所以像

一样的检查
if (!$mysqli) {

不足以告诉您是否存在连接问题 - 所以当您这样做时,您在这里做错了。 $mysqli始终是真实的,所以永远不会输入if子句。相反,您需要检查是否可以通过查找 mysqli连接错误来建立与服务器的连接。你可以通过检查它的错误号来做到这一点。如果没有则为0(整数零),如果有错误则为非零整数(真值)(因为它比错误号:

if ($mysqli->connect_errno) {

此属性也在PHP手册中记录,请参阅mysqli::$connect_errno。我无法详细解释不同的错误编号,但您可以在Mysqli文档中找到它们:C.3. Server Error Codes and Messages

作为另一种选择 - 它也可用于检查先前的连接是否仍处于活动状态 - 是运行测试查询:

if (NULL === $mysqli->query("SELECT 1;")) {

如果您无法连接到数据库服务器,SELECT 1;这样的简单查询会返回NULL。这是针对连接到服务器时可能出现的许多问题:您可能使用了错误的用户名或密码((HY000 / 1045)“拒绝访问”),服务器错误((HY000 / 2002)“连接失败” )甚至使用错误的数据库((HY000 / 1049)“未知数据库”)。

运行此类测试查询很容易,并且可以快速告诉您连接是否顺利。如果您成功连接,则返回mysqli_result类型的对象,该对象不符合=== NULL的条件,因此更新if-clause将很好地涵盖所有这些失败和成功方案。

它还向您展示了另一个伟大的原则:大多数方法返回一些您可以检查的内容,以发现是否出现问题。

执行INSERT查询:

检查错误的下一个位置是执行INSERT ... SQL查询:

// execute query
$mysqli->query($query);

正如您的此代码所示,您根本没有在此处执行任何错误检查。再次,这是错误的。相反,由于您的期望不匹配,您需要在此处验证插入是否有效。同样,该方法返回一个值,在INSERT ... SQL查询的情况下,无论查询是否有效,这都是 boolean

// execute query
$result = $mysqli->query($query);
if (!$result) {
    throw new Exception(
        sprintf(
            'query "%s" failed: (%s/%d): %s', $query,
            $mysqli->sqlstate, $mysqli->errno, $mysqli->error
        )
    );
}

正如此示例所示,再次添加了对返回值的正确检查,如果出现问题,则通过读取$mysqli连接对象的相应属性(此处为{{3)来给出错误消息。 },mysqli::$sqlstatemysqli::$errno

在跑到“没有给出错误”的结论之前,最好仔细检查出了什么问题。首先检查是否必须自动给出错误(例如,在屏幕上还是在日志文件中?)。或者如果不是甚至由你来检查错误条件,因为失败总是一个选项,并且即使你使用它,也不会将“不起作用”的所有内容视为PHP扩展或PHP语言的故障。