我有以下 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);
}
}
}
}
当脚本运行时,我没有收到任何错误,但数据库中没有插入任何行。我尝试通过执行以下操作来查找错误:
在->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
在 ->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
中检查语句是否正确执行,然后反馈发现的错误。
-
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/