gpt4 book ai didi

php - 使用PHP根据用户输入“构建”准备好的SQL语句

转载 作者:行者123 更新时间:2023-11-29 15:37:45 24 4
gpt4 key购买 nike

这个问题很难表达,但是基本上我有一个表格。这是一个帐户信息表格,用户可以在其中更改与其帐户相关联的信息。要注意的是,整个表单的提交都是可选的,每个输入都是可选的(将输入保留为空以保持不变)。因此,例如,使用此表格,您可以更改城市,地址和电话。但是,一个人可以选择仅填写城市,按提交,然后该信息才被更新,所有其他信息保持不变。

使用手中的代码可能更有意义,这是我用来完成此任务的PHP。有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时,反复地运行该 foreach似乎很愚蠢。从我从PHP和编程基础知识中学到的知识,这是非常WET的代码,其中T不再是两倍,而是6倍。为了解决这个问题,我创建了一个数组,然后设置了 implode输入。将列名添加到该数组。完成后,使用逗号分隔符 prepared_Query()数组。最后,使用该内含数组创建SQL语句。

这将根据设置的任何输入输出动态构建的SQL语句。因此,如果“城市”和“地址”包含数据,则该语句将如下所示:

$sql = "UPDATE _MAIN_meta SET meta_city = ?, meta_addr = ? WHERE meta_user = ?;";


现在,我已经完成了这一步,这取决于我填写的SQL语句最终输出的输入正是我想要的。

问题...

...我要把那个语句绑定到变量变量上。当我不知道要设置哪些变量时,我不知道是否有可能将所有设置的var-vars都放入此 函数的参数中。

可能我的逻辑是有缺陷的,但是我已经接近使它起作用了,我不得不问是否有办法可以做到这一点,或者这样做是否有意义。这对我来说很有意义,但是以前我已经用PHP解决了一些非常讨厌的漏洞。我敢肯定,有人在做这样的事情时比我更常识。

所以我的问题是,当每个变量都是可选的时,如何将变量Variables绑定到准备好的SQL语句。有没有什么方法不必为每个输入编写单独的语句?或更短/更快的方式来做到这一点?

这些SO问题类似,但不回答我的问题:

dynamically generating an SQL statement based on user form input

Dynamic SQL SELECT Statement with PHP based on user options

似乎还有其他类似的问题,但是我找不到一个明确的例子说明有人试图解决同样的问题。这就是让我认为我的逻辑有缺陷的原因。

有人能指出我正确的方向吗?

注意:我想我已经粘贴了与该问题相关的所有内容,如果有不清楚的地方请通知我。

最佳答案

其他两个答案都差不多。

@ sh4dowb的答案非常适合在可能存在难以自动化的不同条件的情况下构造SELECT查询。但是对于UPDATE查询,没有必要手动选择每个子句,循环将是一种更干净的解决方案。

@ooa演示的方法更好,但他们忘记创建实际的更新子句。此外,它正在使用这些卑鄙的变量变量。

但是正确的解决方案几乎已经存在。我们将使用我的示例来完成Paa的How to create a prepared statement for UPDATE query

// the list of allowed field names
$allowed = ['prov', 'city', 'addr', 'code', 'phone', 'phone_alt'];

// initialize an array with values:
$params = [];

// initialize a string with `fieldname` = ? pairs
$setStr = "";

// loop over source data array
foreach ($allowed as $key)
{
if (!empty($_POST[$key]) && $key != "id")
{
$setStr .= "`$key` = ?,";
$params[] = $_POST[$key];
}
}
$setStr = rtrim($setStr, ",");

$params[] = $_POST['id'];
prepared_query("UPDATE _MAIN_meta SET $setStr WHERE main_user = ?", [$params]);


出于天生的缘故,请忽略变量变量。它们绝对没有用例,但它们可能造成相当大的伤害。 $_POST数组是您数据的绝佳来源,不需要任何其他操作。

关于php - 使用PHP根据用户输入“构建”准备好的SQL语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58059202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com