【问题标题】:MySQLi, PHP, generate automated preparedStatement dynamically [duplicate]MySQLi,PHP,动态生成自动preparedStatement [重复]
【发布时间】:2020-12-22 17:47:21
【问题描述】:

我的基本问题是为数据库请求生成一个自动准备好的语句

  $this->stmt_prep->bind_param("sss", $input[0], $input[1], $input[X]);

基本上有 2 个“变量”,我为此请求创建了:

  1. 数据类型“ssss”
  2. 用户输入字段为“$Array_as_single_Values”

假设:

$this->stmt_prep->bind_param("sss", $Array_as_single_Values);
$Array_as_single_Values = "Value1", "Value2", "ValueX"

我将 UserInput 读出为

$Value = Array[$input1=> value1, $input2=> value2, $inputX=> valueX]

如何将这个数组的每个值转换为变量或其值

预期结果:

$Array_as_single_Values [$input1 => "value1"; 
$input2 => "value2"; 
$inputX => "valueX";]        //how to Convert this to needed Data?

$this->stmt_prep->bind_param("sss", $Array_as_single_Values);

同:

$this->stmt_prep->bind_param("sss", $input1, $input2, $inputX);

$this->stmt_prep->bind_param("sss", "value1", "value2", "valueX");

目的:如果我有 100 个不同的输入值,我不必重新编写所有语句

【问题讨论】:

  • 你是在问如何在事先不知道会有多少个参数的情况下绑定参数?如果是这样,那么答案已经在这里了:stackoverflow.com/questions/24627086/…(以及在线的其他几个地方)
  • 对生成自动准备好的语句表示赞成。在这里问的 100 个人中只有一个有这么好的主意
  • 是的,我没有写下9个值,但是值和运算符一样多。对不起:)
  • 如果您想使用显式类型,只需将其设为可选即可。示例见我的mysqli helper function

标签: php mysqli


【解决方案1】:

使用 splat 运算符 ...

$this->stmt_prep->bind_param("sssssssss", ...$Array_as_single_Values);

小例子:

function foo ($a, $b, $c)
{
    echo "$a $b $c";
}

$arr = [ "hello", "world", "42" ];

foo(...$arr); // output hello world 42

没有运算符,这会导致错误“致命错误:未捕获的 ArgumentCountError:函数 foo() 的参数太少”

如果您想自动生成"s" 并且确定您将只使用 VARCHAR 类型,您可以像这样重写您的函数调用:

$this->stmt_prep->bind_param(str_repeat("s", count($Array_as_single_Values)), ...$Array_as_single_Values);

【讨论】:

  • @FunkFortyNiner 证明它;)因为它可以在我的一台服务器上运行,即使在严格模式下也是如此。最好使用正确的数据类型 "s" "i" "d" ...以保持一致性,但这不是绝对必需的。
  • @IncredibleHat 我之所以这么说,是因为我看到很多问题被问到如果数据类型不匹配,就会出错。
  • @IncredibleHat 嘿! Magnus 的想法是正确的。那里的动物完全不同吧? :-))
  • @FunkFortyNiner 是的...我自己的旧 mysqli db 对象循环遍历这些值并在它们上执行 is_int、is_double、is_string 以设置为 d...但是这些天 pdo 更美味了mysqli。我想也许我们应该清理我们的 cmets :D
  • @IncredibleHat 我认为我们的大多数 cmets 都是相关的,如果其他人对我对数据类型的看法也有同样的感受。他们也不应该被标记,咳咳先生。“你知道你是谁”。
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 2014-05-14
  • 2015-06-14
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
相关资源
最近更新 更多