还是非常新的mysqli并试图学习。我正在进入更复杂的事情。
我已经创建了一个测试脚本,使用预准备语句将数据插入两个单独的表中。
我想知道的是在将信息插入第二个表格之前,我如何首先检查该表格以确保数据不存在。
我用Google搜索,无法想出一个好方法来解决这个问题。
我正在使用的代码是:
<?php
define('DB_SERVER', "xxx");
define('DB_USER', "xxx");
define('DB_PASSWORD', "xxx");
define('DB_TABLE', "xxx");
// The procedural way
$mysqli = mysqli_connect(DB_SERVER, DB_USER, DB_PASSWORD, DB_TABLE);
$mysqli->set_charset("utf8");
$mysqli->query("SET NAMES 'utf8'");
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
$mysqli->autocommit(FALSE); //turn on transactions
$stmt1 = $mysqli->prepare("UPDATE tbl_test01 SET testdata = ?, testisotope = ? WHERE testID = ?");
$stmt2 = $mysqli->prepare("INSERT INTO tbl_test02 (testdata, testID) VALUES (?,?)");
$stmt1->bind_param("ss", $_POST['testdata'], $_POST['testisotope']);
$stmt2->bind_param("si", $_POST['testdata'],$_POST['testID']);
$stmt1->execute();
$stmt2->execute();
$stmt1->close();
$stmt2->close();
$mysqli->autocommit(TRUE); //turn off transactions + commit queued queries
} catch(Exception $e) {
$mysqli->rollback(); //remove all queries from queue if error (undo)
error_log($e);
}
?>
我尝试过做这样的事情,但那不起作用
$stmt2 = $mysqli->prepare("INSERT INTO tbl_test02 (testdata, testID) SELECT DISTINCT ?, ? FROM tbl_test02 WHERE NOT EXISTS(SELECT * FROM tbl_test02 WHERE testID = ? )");
好吧,经过一番努力,我相信我做到了这一点,实际上让我很开心。
我的新代码就是这样,出现才能正常运行。直到我进行测试,然后将其迁移到真实的程序中。
<?php
define('DB_SERVER', "xxxx");
define('DB_USER', "xxxx");
define('DB_PASSWORD', "xxxx");
define('DB_TABLE', "xxxx");
// The procedural way
$mysqli = mysqli_connect(DB_SERVER, DB_USER, DB_PASSWORD, DB_TABLE);
$mysqli->set_charset("utf8");
$mysqli->query("SET NAMES 'utf8'");
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$testID = $_POST['testID'];
$stmt_check = $mysqli->prepare("SELECT * FROM tbl_test02 WHERE testID =?");
$stmt_check->bind_param("i", $testID);
$stmt_check->execute();
$stmt_check->store_result();
if($stmt_check->num_rows > 0){
$stmt1 = $mysqli->prepare("UPDATE tbl_test01 SET testdata = ?, testisotope = ? WHERE testID = ?");
$stmt1->bind_param("ssi", $_POST['testdata'], $_POST['testisotope'],$_POST['testID']);
$stmt1->execute();
$stmt1->close();
} else {
$mysqli->autocommit(FALSE); //turn on transactions
$stmt1 = $mysqli->prepare("UPDATE tbl_test01 SET testdata = ?, testisotope = ? WHERE testID = ?");
$stmt2 = $mysqli->prepare("INSERT INTO tbl_test02 (testdata2, testID) VALUES (?,?)");
$stmt1->bind_param("ssi", $_POST['testdata'], $_POST['testisotope'], $_POST['testID']);
$stmt2->bind_param("si", $_POST['testdata'],$_POST['testID']);
$stmt1->execute();
$stmt2->execute();
$stmt1->close();
$stmt2->close();
$mysqli->autocommit(TRUE); //turn off transactions + commit queued queries
}
?>
答案 0 :(得分:0)
Daniel如果 testID 是tbl_test02中的唯一列,那么您可以使用 INSERT IGNORE 查询来插入数据。
如果tbl_test02中已经存在相同的testID,它将忽略数据的插入,否则它将在tbl_test02中插入新数据。
如果没有,则为testID列创建唯一索引并使用相同的索引,因为它将减少您的许多代码行和执行时间。
以下是代码:
$stmt2 = $mysqli->prepare("INSERT IGNORE INTO tbl_test02 (testdata, testID) VALUES (?,?)");