准备好的声明插入多个查询但检查第二个表

时间:2018-01-11 15:03:52

标签: php mysqli prepared-statement

还是非常新的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
} 

?>

1 个答案:

答案 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 (?,?)");