PHP SQL 仅当 post 数据具有使用 COALESCE() 给出的输入时更新

PHP SQL UPDATE only if post data has input given using COALESCE()

大家好,我已经阅读了很多关于此的 post 文章(非常古老),我已经尝试了其中的所有内容,但我似乎无法找出问题所在..

所以我有一个用于更新 table 记录的表格。但是如果没有输入名称,那么它不会保留原始名称并更新其余部分,它只是用空字符串替换它。

我试过使用 COALESCE() 但它无法将我的 php 代码中的任何内容识别为 NULL 值。

如果我不加引号 '' 那么我会得到 SQL 错误,但如果我这样做,它就不会被识别为 null..

例如,如果我 ssh 进入 运行 MySQL 并输入..

select 合并('','test');

然后 MySQL 只显示空字符串而不是包含内容的字符串。

似乎无法通过使用 post 变量进行查询而没有引号问题..

这是我的代码...

/* Original query that replaces with empty input feilds...
$update = "UPDATE KIT202_product SET Name='". $_POST['name']
. "', Price='". $_POST['price']
. "', Description='". $_POST['desc']
. "' WHERE ID=". $_POST['id'];
*/

//What I ended up trying but still doesn't work :(...
$name=NULL;
if (!empty($_POST['name'])) $name="'". $_POST['name']. "'";
$price=NULL;
if (!empty($_POST['price'])) $price="'". $_POST['price']. "'";
$desc=NULL;
if (!empty($_POST['desc'])) $desc="'". $_POST['desc']. "'";

这是行不通的,因为 null 只是不传递任何东西而不是 NULL,所以它就像 运行ning 合并只有 1 个值。

如果你做两件事会怎样:1)为你的字段创建一个小的验证函数; 2) 拆分更新以仅更新已通过验证的内容。 因此,松散地:

$updatePrefix = "UPDATE KIT202_product SET ";
$updateSuffix = "WHERE ID=". $_POST['id']; // You should first these for injection

$conditions = '';
if (isValid($_POST['name'])) $conditions .= " Name='".$_POST['name']."'";
if (isValid($_POST['price'])) {
   if ($conditions != '') $conditions .= ', ';
   $conditions .= " Price= '".$_POST['price']."'";
}
if (isValid($_POST['desc'])) {
    if ($conditions != '') $conditions .= ', ';
    $conditions .= " Description= '".$_POST['desc']."'";
}

if ($conditions != '') $query = $updatePrefix . $conditions . $updateSuffix;

function isValid($input) {
    return (!(empty($input) && $input == ''));
}

这应该可以满足您的需要。

更新: 回答您的评论,是的,您可以使用 COALESCE。尝试这样的事情:

$name=NULL;
if (!empty($_POST['name'])) $name="'". $_POST['name']. "'";
$price=NULL;
if (!empty($_POST['price'])) $price="'". $_POST['price']. "'";
$desc=NULL;
if (!empty($_POST['desc'])) $desc="'". $_POST['desc']. "'";
$update = "UPDATE KIT202_product SET Name=COALESCE($name, KIT202.Name)"
. "', Price=COALESCE($price,KIT202.Price)"
. "', Description=COALESCE($desc, KIT202.Description)"
. "' WHERE ID=". $_POST['id'];