PHP - MySQL 查询不能完全工作

标签 php mysql mysqli

我正在使用 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/

相关文章:

php - 提交联系我们表格时,我想留在这个联系表格中

php - Symfony2 Lazy Services 何时使用?

php - 使用 prepare 命令更新我的表,将值增加 2

php - 从mysql切换到mysqli后,Ajax的更新语句不能正常工作,但没有显示的错误

javascript - 从 javascript 保存 3 个 php 变量

php - 在 Woocommerce 中为类别应用优惠券时自定义购物车商品价格

php - 在我可以发布我的网站之前,我需要多少网络安全知识?

mysql - 带有附加位置的全文搜索

php - MySQL:仍然无法将数据本地内文件 '/path/to/file.txt' 加载到由 '\n' 终止的表测试字段中

MySQL - 使用 BETWEEN 搜索负经度值