PHP-MySQL查询无法完全运行
我正在使用PHP-MySQL查询无法完全运行,php,mysql,mysqli,Php,Mysql,Mysqli,我正在使用REPLACE-INTOquery使用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 = $r
REPLACE-INTO
query使用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行
,并更新了大约几行。我已尝试打印\u r
所有变量$outletid,$loc…
,其中的值都是正确的。我不确定这是怎么发生的。我也尝试了
回显错误,但什么也没有显示
if (!mysqli_query($conn,$sql))
{
echo("Error description: " . mysqli_error($conn));
}
代码中的模式似乎容易受到SQL注入的攻击。最佳实践是使用绑定占位符,并提供值作为绑定值
静态SQL文本
将SQL文本准备到语句中
然后我们可以在循环中处理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 ...
预期的结果是什么?你没有解释清楚。你知道REPLACE-INTO
是如何工作的吗,这就是你真正想要使用的吗?您正在准备,但仍在直接传递值?没有意义。这不是编写准备好的语句的方式(参数化!)。此外,该数据来自何处,可能可以在1个查询中完成。@Script47预期结果应该是要插入的缺失行,以及删除并插入的当前行again@user3783243来自$data,它是一个保存在值上的数组,$data
是否已经来自数据库?
DELETE FROM syscompany WHERE outletid = ? ;
DELETE FROM syscompany WHERE coname = ? and addr1 = ? ;
INSERT INTO syscompany ...