Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-MySQL查询无法完全运行_Php_Mysql_Mysqli - Fatal编程技术网

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 ...