Php 仅使用非空值更新MYSQL行

Php 仅使用非空值更新MYSQL行,php,mysql,database,Php,Mysql,Database,我有一个包含大量行的表,我需要使用特定ID更新行,例如,假设我有一行包含以下详细信息: Id= 1 Name= lessa Address = USA 现在,我使用以下PHP代码来更新该行: <?php $con = mysqli_connect("localhost","MyUserName","MyPassword","DB"); $id = '1'; $name = ""; $address = "UK"; // update only non value items $r=mys

我有一个包含大量行的表,我需要使用特定ID更新行,例如,假设我有一行包含以下详细信息:

Id= 1
Name= lessa
Address = USA
现在,我使用以下PHP代码来更新该行:

<?php
$con = mysqli_connect("localhost","MyUserName","MyPassword","DB");
$id = '1';
$name = "";
$address = "UK";
// update only non value items
$r=mysqli_query($sql);
mysqli_close($con);
?>
此外,如果在另一个时间名称值更改,地址保持不变,我只需要更新名称

还假设我有100列,而不是这个例子中的3列

如有任何关于编写更新声明的帮助,我们将不胜感激

更新:

我使用以下代码,但没有更新:

<?php
$con = mysqli_connect(DB info);
$id = 'jo_12';
$name = "";
$address = "UK";
$sql = "UPDATE info
        SET name = IF(? = '', name, ?),
            address = IF(? = '', address, ?)
        WHERE id = ?";
$stmt = $con->prepare($sql);
$stmt->bind_param("ssssi", $name, $name, $address, $address, $id);
$stmt->execute();

mysqli_close($con);
?>

尝试使用此SQL查询:

UPDATE table_name SET Address='UK' WHERE ID=1
当然,您可以用ID=1替换任何其他数字。

在更新查询中放置测试:


如果变量为空,IF测试会将列的旧值重新分配给它。

首先,mysql\u错误不会与mysql\u以外的任何其他API混合。编辑:所以你改变了它,好吗。现在,您还需要向查询传递DB连接。了解更新您可以创建一个数组,其中字段名是键,值是值,然后循环遍历该数组并使用?并使用PDO的execute函数传入数组并立即准备和执行。使用MySQLi执行此操作并不容易,因为您必须在bind_param中单独列出所有字段,而不是传入数组。演示如何使用mysqli.no动态构建准备好的查询,但如果名称更改,地址仍然保留,我将在第二次执行此操作?我需要update语句来发现空值,而不是更新它。很抱歉,我不理解您的问题。是否仅在某列为NULL时更新?@TomasPajurek他只想在相应变量不为NULL时更新该列。因此,如果$name不是空的,他想用这个名字来更新这个名字。“Barmar Yea,我现在得到了,我认为你的答案是正确的。谢谢你,先生,但是你能解释一下这个语句名= IF?名称行吗?那么它的参数是什么意思呢?你需要阅读关于准备好的语句的mysqli文档。这个占位符将替换为bind_param中相应的变量。应用占位符后,不会发生任何更新:不要尝试在注释中发布代码,因为没有格式,而且很难读取。如果id是字符串,而不是数字,请使用SSS而不是ssssi。
UPDATE table_name SET Address='UK' WHERE ID=1
$sql = "UPDATE yourTable
        SET name = IF(? = '', name, ?),
            address = IF(? = '', address, ?)
        WHERE id = ?";
$stmt = $con->prepare($sql) or die ($con->error);
$stmt->bind_param("sssss", $name, $name, $address, $address, $id);
$stmt->execute();