【发布时间】:2020-01-21 16:59:21
【问题描述】:
这个问题有点难以表达,但基本上我有一个表格。这是一种帐户信息表格,人们可以在其中更改与其帐户关联的信息。问题是整个表单都被提交,每个输入都是可选的 (Leave input empty for no-change) 。因此,例如使用此表格,您可以更改您的城市、地址和电话。但是,一个人可以选择只填写城市,按提交,然后更新该信息,所有其他信息保持不变。
手头的代码可能更有意义,这是我用来完成这项任务的 PHP;包含代码的 cmets 有 4 行,因为它们试图回答我自己的问题,所以这些被留下了;他们可能有助于解释我想要实现的目标:
PHP
// SQL HELPER
function prepared_Query($con, $sql, $params, $types = ""){
$types = $types ?: str_repeat("s", count($params));
$stmt = $con -> prepare($sql);
$stmt -> bind_param($types, ...$params);
$stmt -> execute();
return $stmt;
}
// TRIM ALL POST VARS
function trim_Val(&$val){
$val = trim($val);
}
array_filter($_POST, 'trim_Val');
// SANITIZE ALL INPUTS
$filter = ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_ENCODE_HIGH | FILTER_FLAG_ENCODE_LOW];
$inputs = ['prov', 'city', 'addr', 'code', 'phone', 'phone_alt'];
$keys = array_fill_keys($inputs, $filter);
$values = filter_input_array(INPUT_POST, $keys);
unset($filter, $inputs, $keys); // cleanup
$sqlA = [];
foreach($values as $key=>$val){
if($val){
$$key = $val;
//$sqlA[] = "meta_".$key." = ?";
}
}
//$sqlA = implode(", ", $sqlA);
//$sql = "UPDATE _MAIN_meta SET ".$sqlA." WHERE meta_user = ?;";
//$stmt = prepared_Query($con, $sql, [$$key, $uid]);
if(!empty($prov)){
$sql = "UPDATE _MAIN_meta SET meta_prov = ? WHERE meta_user = ?;";
$stmt = prepared_Query($con, $sql, [$prov, $uid]);
$stmt -> close();
echo "Updated Province";
}
if(!empty($city)){
$sql = "UPDATE _MAIN_meta SET meta_city = ? WHERE meta_user = ?;";
$stmt = prepared_Query($con, $sql, [$city, $uid]);
$stmt -> close();
echo "Updated City";
}
if(!empty($addr)){
$sql = "UPDATE _MAIN_meta SET meta_addr = ? WHERE meta_user = ?;";
$stmt = prepared_Query($con, $sql, [$addr, $uid]);
$stmt -> close();
echo "Updated Address";
}
if(!empty($code)){
$sql = "UPDATE _MAIN_meta SET meta_code = ? WHERE meta_user = ?;";
$stmt = prepared_Query($con, $sql, [$code, $uid]);
$stmt -> close();
echo "Updated Postal Code";
}
if(!empty($phone)){
$sql = "UPDATE _MAIN_meta SET meta_phone = ? WHERE meta_user = ?;";
$stmt = prepared_Query($con, $sql, [$phone, $uid]);
$stmt -> close();
echo "Updated Phone";
}
if(!empty($phone_alt)){
$sql = "UPDATE _MAIN_meta SET meta_phone_alt = ? WHERE meta_user = ?;";
$stmt = prepared_Query($con, $sql, [$phone_alt, $uid]);
$stmt -> close();
echo "Updated Alt. Phone";
}
$con -> close();
您可能会告诉我,我一遍又一遍地重复最后一个函数,而重复运行 $stmt 似乎很愚蠢,因为它可以通过一次执行来完成。根据我在 PHP 和编程基础方面所学的知识,这是非常 WET 的代码,其中 T 不再是两倍,而是 6 倍。为了解决这个问题,我创建了一个数组,然后设置了 foreach 输入;将列名添加到该数组。一旦完成implode 数组使用逗号分隔符。最后使用该内爆数组创建 SQL 语句。
这会根据设置的任何输入输出动态构建的 SQL 语句。因此,如果 City 和 Address 包含数据,则语句将如下所示:
$sql = "UPDATE _MAIN_meta SET meta_city = ?, meta_addr = ? WHERE meta_user = ?;";
到目前为止,我已经完成了这项工作,具体取决于我填写的输入,SQL 语句的最终输出正是我想要的。
问题...
...当涉及将该语句绑定到变量变量时,我有。当我不知道设置了哪些参数时,我不知道是否有可能将设置的 var-vars 的 ALL 放入此 prepared_Query() 函数的参数中。
可能我的逻辑是有缺陷的,但我已经非常接近让它发挥作用了,我不得不问是否有办法可以实现这一点,或者这样做是否有意义。这对我来说很有意义,但我以前用 PHP 遇到过一些非常讨厌的黑洞。我敢肯定,在做这样的事情时,有人比我更懂常识。
所以我的问题是,当每个变量都是可选的时,如何将变量变量绑定到准备好的 SQL 语句。有没有办法不必为每个输入编写单独的语句?或者更短/更快的方式来做到这一点?
这些 SO 问题相似,但不回答我的问题:
dynamically generating an SQL statement based on user form input
Dynamic SQL SELECT Statement with PHP based on user options
似乎还有其他一些类似这样的问题,但我找不到一个明确的例子来说明有人试图解决同样的问题。这就是让我觉得我的逻辑有某种缺陷的原因。
谁能指出我正确的方向,好吗?
注意:我想我已经粘贴了与问题相关的所有内容,如果有不清楚的地方请告诉我。
【问题讨论】:
标签: php mysqli sql-update