我正在使用 REPLACE INTO
查询通过 foreach
从数组更新我的数据库。
foreach ($data as $row) {
$outletid = $row['outletid'];
$loc = $row['loc'];
$coname = $row['coname'];
$addr1 = $row['addr1'];
$addr2 = $row['addr2'];
$addr3 = $row['addr3'];
$type1 = $row['type1'];
$type2 = $row['type2'];
$type3 = $row['type3'];
$type4 = $row['type4'];
$type5 = $row['type5'];
$mdate = $row['mdate'];
$sql = $conn->prepare("REPLACE INTO syscompany (outletid, loc, coname, addr1, addr2, addr3, type1, type2, type3, type4, type5, mdate)
VALUES ('$outletid', '$loc', '$coname', '$addr1', '$addr2', '$addr3', '$type1', '$type2', '$type3', '$type4', '$type5', '$mdate')");
$sql -> execute();
}
我的数据库中有 147 行
记录。然而,查询并不能完全工作。我尝试删除 30 行
并从数据库中修改随机行,但查询仅插入回5 行
并更新大约几行。我尝试 print_r
所有变量 $outletid, $loc ...
并且里面的值都是正确的。我不确定它会如何发生。
我也尝试过 echo
错误,但没有显示任何内容。
if (!mysqli_query($conn,$sql))
{
echo("Error description: " . mysqli_error($conn));
}
最佳答案
代码中的模式似乎容易受到 SQL 注入(inject)攻击。最佳实践是使用绑定(bind)占位符,并提供值作为绑定(bind)值。
静态 SQL 文本
$sql = 'REPLACE INTO syscompany
( outletid, loc, coname
, addr1, addr2, addr3
, type1, type2, type3
, type4, type5, mdate
) VALUES
( ?, ?, ?
, ?, ?, ?
, ?, ?, ?
, ?, ?, ?
)';
将 SQL 文本准备到语句中
if(! $stmt = $conn->prepare($sql)) {
// handle error
}
然后我们可以在循环中处理RBAR,执行之前准备好的语句...
foreach( ... ) {
...
...
// bind values and execute
$stmt->bind_param('ssssssssssss'
, $outletid, $loc, $coname
, $addr1, $addr2, $addr3
, $type1, $type2, $type3
, $type4, $type5, $mdate);
if(! $stmt->execute() ) {
// handle error
}
}
<小时/>
我们不知道该表是否有主键或任何唯一索引。我们只能推测。行为将取决于该情况以及表中已存在的行。
REPLACE INTO
作为一系列 DELETE
语句进行操作,后跟 INSERT
。假设 outletid
是表的主键,并且 (coname,addr1)
是唯一键
REPLACE INTO
相当于运行这两个语句
DELETE FROM syscompany WHERE outletid = ? ;
DELETE FROM syscompany WHERE coname = ? and addr1 = ? ;
(由要插入的行提供的值),后跟
INSERT INTO syscompany ...
关于PHP - MySQL 查询不能完全工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50711407/