【问题标题】:msqli does not INSERTmsqli 不插入
【发布时间】:2013-07-30 08:55:29
【问题描述】:

我试图将表单中的数据(通过 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。

【问题讨论】:

  • 不要在表名和字段名上使用单引号。那应该是反引号。
  • 您可以“回显”您的查询,并尝试在 phpMyAdmin 中查看错误.. 或使用$mysqli-&gt;query($query) or die($mysqli-&gt;error)

标签: php mysql mysqli xampp


【解决方案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/AND 如果你有 dtStampDEFAULT = CURRENT_TIMESTAMP 你可能不需要像这样插入:

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

【讨论】:

    【解决方案2】:

    你自己写,“它没有显示任何错误”。在进行如此广泛的分析时,您需要牢记一些事情(并将其列入您的清单)。

    首先,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) "Unknown database")。

    运行这样的测试查询很容易,并且可以快速告诉您连接是否顺利。如果您成功连接,则返回一个类型为 mysqli_result 的对象,它不符合 === NULL 的条件,因此更新 if 子句很好地涵盖了所有这些失败和成功场景。

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

    执行插入查询:

    下一个检查错误的地方是执行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::$sqlstate,@ 987654327@和mysqli::$error

    所以在得出“没有给出错误”的结论之前,最好仔细检查一下出了什么问题。首先检查是否必须自动给出错误(以及在哪里,例如筛选或进入日志文件?)。或者,如果甚至不由您来检查错误情况,因为失败始终是一种选择,并且即使您使用 PHP 扩展或 PHP 语言,并非所有“不起作用”的东西都可以被视为故障。

    【讨论】:

      猜你喜欢
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      相关资源
      最近更新 更多