PHP MySQL 准备语句,动态构建 bind_param 的类型列表

问题描述 投票:0回答:1

我正在尝试找到一种简单的方法来构造字符串以在 MySQLi 中传递准备好的语句,尤其是类型“isiis”。

我已经有一个包含要传递给查询的参数的数组,通过循环遍历它,我可以通过检查数组中的每个值是否都是数字来构建另一个数组,我使用 is_numeric() 函数,或者不是。

问题是,通过这样做,写入数据库的方法,我使用一个类,崩溃了。

如果我使用 str_repeat() 函数构建类型数组并为所有变量分配值“s”,它不会崩溃。

下面是一些便于理解的代码。

这是我的 $args 数组

数组 ( [0] => 1433 [1] => 2 [2] => 71 [3] => 0 [4] => 你好 [5] => 皮波 [6] => 1 [7] => 1 [8] => 1 [9] => 9 )

我只需要区分数字变量和其余变量,所以我这样做 诸如...

$fields = array();

foreach ($args as $s) {

    if(is_numeric($s)){
        $fields[] = 'i';
        #echo "is numeric";
    }
    else{
        #echo "is other";
        $fields[] = 's';
    }

}

返回的内容为

echo '<pre>'; print_r($fields); echo '</pre>';


Array
(
    [0] => i
    [1] => i
    [2] => i
    [3] => i
    [4] => s
    [5] => s
    [6] => i
    [7] => i
    [8] => i
    [9] => i
)

现在我以两种方式检索数据('iissi..etc,etc')

$types = implode("", $fields);

$types2 = str_repeat('s',sizeof($args));


echo printf("function implode return %s type %s and has len  %s.", $types ,gettype($types), strlen($types));
echo "<br>";
echo printf("function str_repeat return %s type %s has len  %s.", $types2 ,gettype($types2), strlen($types2));

第一种方法,使用implode()函数不起作用并返回:

函数 implode 返回 iiiissiiii 类型字符串且长度为 10.63

使用 str_repeat() 函数的第二种方法工作并返回:

函数 str_repeat 返回 ssssssssss 类型字符串,长度为 10.62

顺便我注意到两个字符串的长度不是整数, 应该是10,而且也略有不同。

这是我的警告。

警告:mysqli::prepare():无法在第 90 行的 /var/www/html/virtualab/engine/dbms.php 中获取 mysqli

致命错误:未捕获错误:调用 bool 上的成员函数 bind_param()

你有什么建议吗?我缺少什么?

感谢您的关注,并对糟糕的代码编写表示歉意...

php mysqli prepared-statement
1个回答
0
投票

使用串联而不是数组

$fields = '';

foreach ($args as $s) {

    if(is_numeric($s)){
        $fields .= 'i';
        #echo "is numeric";
    }
    else{
        #echo "is other";
        $fields .= 's';
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.