1

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

4

2 回答 2

2

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

尝试这个:

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

OR/AND 如果Transaction_Num是,AUTO_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);";
于 2013-07-30T09:28:12.030 回答
0

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

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

解释整个PHP 错误配置对于这里的答案来说太过分了,这是一个很好的资源(在已经详细记录所有内容的手册旁边),我们在 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。服务器错误代码和消息

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

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

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

运行这样的测试查询很容易,并且可以快速告诉您连接是否顺利。如果您成功连接,则返回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和)mysqli::$errno给出错误消息mysqli::$error

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

于 2013-07-30T09:49:55.897 回答