我有这两个功能。 $ stmt查询将数据两次插入我的dbase中,甚至带有检查例程。
一整天都在尝试捕获错误,但是我只是找不到它。
被称为完全相同的常规MySQLi例程确实确实只插入了一次数据。
我只是不知道为什么。做过一些回声检查,回声SQL插入等等。我只是不知道发生了什么。我还没有使用$ stmt很多,但是想在某种程度上改善程序员的生活。这没有帮助:-)
使用以下命令在XAMPP上运行测试: Apache / 2.4.29(Win32)OpenSSL / 1.1.0g PHP / 7.2.1 Clientversie van数据库:libmysql-mysqlnd 5.0.12-dev-20150407 PHP版本:7.2.1
此代码将其插入两次:
NULL
与此完全相同的数据可以完成预期的工作。一个插入。
$result = mysql_insert_array_serialised($conn, $dbt_serialsets, $_POST, $addon);
function mysql_insert_array_serialised($conn, $table, $data, $addon = "mc_api") {
$random_code = substr(str_shuffle(MD5(microtime())), 0, 12);
$settings = serialize($data);
$uid = $_SESSION['uid'];
$sql_chk = "SELECT sn FROM $table WHERE sn = ?";
if ($stmt = $conn->prepare($sql_chk)) {
$stmt->bind_param('s', $random_code);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows == 0) {
// SN doesnt already exist
$sql_insert = 'INSERT INTO ' . $table . ' (uid, addon, sn, settings) VALUES (?, ?, ?, ?)';
if ($stmt = $conn->prepare($sql_insert)) {
$stmt->bind_param('ssss', $uid, $addon, $random_code, $settings);
$stmt->execute();
if (!$stmt->execute()) {
echo $stmt->error;
}else{
return array(
"mysqli_error" => false,
"sn" => $random_code
);
}
} else {
echo 'Could not prepare statement!';
}
}
}
}
我很困惑。很少有人回答类似的问题,有人说上传到http服务器后就解决了,我只在本地测试XAMPP上运行
由于你们中的一些人认为双重$ stmt-> execute是问题,所以不是。一种用于选择(检查是否存在),一种用于插入新数据。
原始功能是这样的,将其改回并仍然插入两次:
$result = mysql_insert_array($conn, $dbt_serialsets, $_POST, $addon);
function mysql_insert_array($conn, $table, $data, $addon) {
$random_code = substr(str_shuffle(MD5(microtime())), 0, 12);
$settings = serialize($data);
$uid = $_SESSION['uid'];
if ($conn->query("INSERT INTO $table (uid, addon, sn, settings) VALUES ('" . $uid . "', '" . $addon . "' , '" . $random_code . "', '" . $settings . "')")) {
return array(
"mysqli_error" => false,
"mysqli_insert_id" => $conn->insert_id,
"mysqli_affected_rows" => $conn->affected_rows,
"mysqli_info" => $conn->info,
"sn" => $random_code
);
} else {
return array("mysqli_error" => $conn->error);
}
}
显然,我读得不好。我很抱歉。帖子中提到的双重执行在那里,删除1确实有帮助。我以为是要检查是否有有效的结果,而不是实际上再次执行查询。
答案 0 :(得分:5)
您有两个呼叫$stmt->execute()
的电话,两个电话都会执行INSERT
:
$stmt->execute();
if (!$stmt->execute()) {
您可以删除第一个。
答案 1 :(得分:3)
它执行两次,因为代码告诉它:
function add_comment_button(postPk) {
$.ajax({
type: "GET",
url: '/user_add_comment',
data: {
"comment_text": $('#user-comment-' + postPk).val(),
"post_pk": postPk,
},
dataType: "json",
success: function (data) {
location.href = data["url"]
},
failure: function () {
alert('There is a problem!!!');
}
});
}
要解决此问题,请删除第一行 $stmt->execute();
if (!$stmt->execute()) {
echo $stmt->error;
}else{
// ....
}
(在此块中,而不是上一个查询的行)或将结果分配给变量并进行检查。