PHP 执行不返回任何错误,但数据库中未添加任何行

标签 php mysql

我有以下 PHP 脚本,当单击注册按钮并且选中地址复选框时,应执行该脚本。

if(isset($_POST['register'])){
   if($_POST['addressCheckBox']  == 'Yes'){
      if(isset($_POST['streetNumber']) && isset($_POST['route']) && isset($_POST['sublocality_level_1'])){
         $unitDetails = trim($_POST['unitDetails']);
         $streetNumber = mysqli_real_escape_string($db, trim($_POST['streetNumber']));
         $route = mysqli_real_escape_string($db, trim($_POST['route']));
         $suburb = mysqli_real_escape_string($db, trim($_POST['sublocality_level_1']));
         $city = mysqli_real_escape_string($db, trim($_POST['city']));
         $zipCode = mysqli_real_escape_string($db, trim($_POST['zipCode']));
         $province = mysqli_real_escape_string($db, trim($_POST['province']));
         $country = mysqli_real_escape_string($db, trim($_POST['country']));
         $email = mysqli_real_escape_string($db, trim($_POST['email']));

         if(!empty($streetNumber)  && !empty($route) && !empty($city) && !empty($province) && !empty($zipCode) && !empty($country)){
            $queryInsertMemberAddress = $db->prepare("INSERT INTO address (memberEmail, unitDetails, houseNumber, streetName, suburb, city, postalCode, province, country) VALUES (?,?,?,?,?,?,?,?,?)");

            $queryInsertMemberAddress->bind_param('ssisssiss', $email, $unitDetails, $streetNumber, $route, $suburb, $city, $zipCode, $province, $country);

            $queryInsertMemberAddress->execute() or die($queryInsertMemberAddress->error);
         }
      }
   }
}

当脚本运行时,我没有收到任何错误,但数据库中没有插入任何行。我尝试通过执行以下操作来查找错误:

  1. ->execute()之后对$queryInsertMemberAddress执行var_dump并返回

    object(mysqli_stmt)[19]
       public 'affected_rows' => null
       public 'insert_id' => null
       public 'num_rows' => null
       public 'param_count' => null
       public 'field_count' => null
       public 'errno' => null
       public 'error' => null
       public 'error_list' => null
       public 'sqlstate' => null
       public 'id' => null
    
  2. ->execute() 之后对 $queryInsertMemberAddress 变量执行 print_r 并返回

    mysqli_stmt Object ( [affected_rows] => 1 [insert_id] => 28 [num_rows] => 0 [param_count] => 9 [field_count] => 0 [errno] => 0 [error] => [error_list] => Array ( ) [sqlstate] => 00000 [id] => 4 
    

我不明白为什么 print_r 显示一行受到影响,但数据库中没有显示任何记录。有人看出我哪里错了吗?

最佳答案

广泛的担忧

每次调用数据库类的方法时,都应该将其包装在 if 中检查语句是否正确执行,然后反馈发现的错误。

  • MySQL error reporting setup

     if(!$queryInsertMemberAddress = $db->prepare("INSERT INTO address (memberEmail, ... , country) VALUES (?,...,?)")){
         die("failed prepare: ".$db->error);
     }
     if(!$queryInsertMemberAddress->bind_param('ssisssiss', $email, ..., $country)){
         die("failed binding: ".$queryInsertMemberAddress->error);
     }
     if(!$queryInsertMemberAddress->execute()){
           die("failed execution: ".$queryInsertMemberAddress->error);
     }
    
  • 删除所有 mysqli_real_escape_string调用,它们是多余的。

  • 您的 MySQL 用户是否被允许向该表插入数据?您的 PHP 连接中指定的用户是否有权 INSERT

<小时/>

我可能完全错了,但我认为可能发生的是你的 bind_param语句正在破坏您的 SQL。

绑定(bind)参数要求给定元素具有第一个字符串中指定的类型,您有 ssisssiss这是所有字符串与一些整数的混合。这很好,但是你的数据全部源自 $_POST元素始终是字符串

因此,如果您 var_dump 正在插入的数据,那么您将 var_dump 大量 (string)键入值。没有(int)键入值。

示例

 $_POST['value'] = "1"; //this is a string
 $value = mysqli_real_escape_string($db,trim($_POST['value'])); //optional, from your code...
 var_dump($value); /// (string)"1";

但是您不能将 Bind Param 转换为所有字符串 ( sssssssss ),因为这将与您尝试插入的 MySQL 列的数据类型不匹配。

我相信正在发生的事情是由于这些类型不匹配 bind_param 缺少值和/或中止整个 SQL,并且由于某种原因没有给您适当的错误反馈。

如何检查

if(!$queryInsertMemberAddress->bind_param('ssisssiss', $email, $unitDetails, ...) ){
    die("bind failed"); //bind_param returns true or false 
}

解决方案建议:

$streetNumber = (int)$streetNumber;
$zipCode = (int)$zipCode;

请告诉我事情进展如何以及这会给您带来什么结果。

关于PHP 执行不返回任何错误,但数据库中未添加任何行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42365311/

相关文章:

java - 我已在数据库中手动检查,但我的列表返回空?

php - Imagick SVG 无法加载图像

javascript - Ajax 数据插入数据库不起作用

php - 动态添加自定义输入字段并将其保存到数据库

php - 使用PHP从S3流音频并支持Range

MySQL:如果第一个条目选择“Where Distinct”,则在查询中不“Distinct”

MYSQL - 无法获得正确的结果

php - 检查 Yii 中是否加载了关系

php - 如何在 PHP 代码中插入笑脸?

php - 我如何找出导致元素出现空格的原因? margin 和填充?