msqli不会插入(msqli does not INSERT)

2019-10-18 10:57发布

我尝试从一个形式(通过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);
   ?>

我瓦特/ PHP 5.4.16,阿帕奇2.4.4和Windows XP上的MySQL 5.6.11上XAMPP 1.8.2运行此。

Answer 1:

不要使用表名和字段名的单引号。 这应该是反引号。

尝试这个:

   $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 /如果你有dtStampDEFAULT = CURRENT_TIMESTAMP你可能不需要插入,要么像:

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


Answer 2:

你写你自己的,“它不显示任何错误”。 有一些事情你需要记住(并在您检查表),用这样一个广泛的分析。

首先,PHP不显示错误始终。 无论它是否显示错误取决于你所使用的错误配置。 当你没有在你的问题表明这是很难说,如果这是一个问题,或者没有,但是,如果您遇到意想不到的事情(像你这样做),你首先应该检查哪里如何报告错误。

在解释整个PHP错误配置将太多这里的答案,一个很好的资源(已经记录了所有的细节,手动旁),我们有这样的一个这里的#1网站:

  • 如何获得有用的错误信息在PHP?

然后,你需要澄清,如果在所有地方,并给出了mysqli的错误。 让我们回顾一下每一个步骤里的东西可以错转出。

连接:

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

实例化的mysqli与错误的凭证并在PHP中给出错误。 但是, mysqli对象将被实例化反正 。 这意味着变量$mysqli永远类型的对象mysqli -不管是否连接成功与否。

正如在PHP中的每个对象始终松散的true ,就像一个检查

if (!$mysqli) {

是不够的告诉你,如果有一个连接问题 - 所以你做,你做什么错在这里。 $mysqli总是truthy所以如果从句体很好地从未进入。 相反,你需要检查,如果到服务器的连接可能已被寻找的mysqli连接错误建立。 您可以通过检查它的错误号这样做。 它是0 (整数零),如果有无,和一个非零整数(truthy)如果有一个误差(因为它不是作为错误编号:

if ($mysqli->connect_errno) {

此属性在PHP手册中记录为好,看到mysqli::$connect_errno 。 不同的错误数字我不能在所有的细节解释,但你可以找到他们这里的mysqli文档中记载: C.3。 服务器错误代码和消息 。

作为另一个备选方案,以这一点 - 这也适用于检查前一个连接仍然有效 - 是运行测试查询:

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

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

运行这样的测试查询是很容易做到并迅速告诉你,如果连接顺利。 在成功连接的情况下,为回报类型的对象mysqli_result它没有资格作为=== NULL ,因此更新,如果子句涵盖了所有这些成功和失败的情况很好。

这也显示了另一个伟大的原理:大部分方法返回的东西,你可以检查发现,如果出事了。

执行插入查询:

其次检查错误是在执行INSERT ... SQL查询:

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

至于你这个代码显示,你没有做任何的错误,在这里所有的检查。 再次,这是错误的。 相反,如您的期望不匹配,你需要的,如果将工作或没有在这里验证。 再次证明方法返回一个值,在的情况下, INSERT ... SQL查询,这是一个布尔查询是否没有工作:

// 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连接对象,这里mysqli::$sqlstatemysqli::$errnomysqli::$error

因此,更好地仔细检查捉迷藏的结论是“没有错误给出”之前发生了什么错误。 首先,检查是否所有的错误已自动获得(和地方,如屏幕或到一个日志文件?)。 或者,如果连这是由你来检查错误条件,因为失败始终是一个选择,而不是一切,“不工作”就可以,甚至当你使用它看作是PHP扩展或PHP语言故障。



文章来源: msqli does not INSERT