我想在将数据输入数据库列之前检查元组数据是否存在。我正在尝试mysql_query并得到我应该使用mysqli的错误,但它似乎对我不起作用。
这是我目前的代码
foreach ($AllData as $sigleData) {
$table = $sigleData['name'];
$columns = implode(", ", $sigleData['columns']);
$columnData = implode(" ',' ", $sigleData['data']);
//insert into database tuple data
$sqlQuery = "INSERT INTO " . $table . " ( " . $columns . ") VALUES( '" . $columnData . "')";
if ($dbConnectionT->query($sqlQuery) == TRUE) {
echo "database updated";
echo "</br>";
}
}
我有这个功能: -
function check_tuple_exists($table){
global $dbConnectionT; // connection to database
$sql = "SELECT ALL FROM '".$table."'";
$res = $dbConnectionT->query($sql);
if ($res->num_rows > 0)
{ // output data of each row
while($row = $res->fetch_assoc()) {
echo "data " . $columnData . "<br>";
}
} else
{
echo "0 results";
}
}
但它给了我这个错误: - 试图获得非对象的属性
答案 0 :(得分:1)
好吧,如果你这样做是因为你想更新/跳过插入你要插入的数据,你应该尝试使用INSERT REPLACE
或INSERT IGNORE
查询,而不是提前检查。对您来说更容易,更清洁,更快速地应用。检查此问题以查看差异:
What is the performance difference between "insert ignore" and replace in MySQL?
基本上:
另外,这就是FYI,请注意您的代码中可能有SQL注入。检查PDO和准备好的语句以避免它们。
答案 1 :(得分:1)
更快更简单的方法(始终确保一致的数据库,独立于PHP)是在MySQL表上创建一个复合UNIQUE
索引(参见MySQL docs,这也可以在phpMyAdmin中实现) 。此索引应包含此组合中必须唯一的所有列;在你的情况下,这将是所有列。
此索引可确保表中没有重复项。使用PHP插入新行时,只需使用语句INSERT IGNORE INTO ...
(请参阅docs)。这将首先检查是否已存在具有相同内容的行。在这种情况下,语句将被忽略,否则将被创建。