【发布时间】:2016-08-09 18:14:44
【问题描述】:
我想构建一个代码,以这种格式获取$bindParam 变量:
$bindParams = [$type1 => $param1, $type2 => $param2, ... ]
我想构建一些代码,将参数动态添加到准备好的语句中。
这是我到目前为止构建的代码:
$mysql = new mysqli("localhost", "root", "", "db1");
$stmt = $mysql->prepare($sql);
foreach($bindParams as $type => $data) {
$stmt->bind_param($type, $data);
}
$stmt->execute();
$result = $stmt->get_result();
// and after perhaps twiddling with the result set, but this is not the case .....
对于您的实例
$sql = "INSERT INTO table1 (name, age) VALUES (?,?);"
和
$bindParams = ["s" => "hello", "i" => 15]
这并不总是具有这种结构,它可以更改为例如$bindParams = ["s" => "hello", "i" => 15, "d" => 22.5],因此$sql 会分别更改。
在编译器第一次转到$stmt->bind_param($type, $data); 之后,firefox 会刷新此错误:
警告:mysqli_stmt::bind_param(): 变量数与第 23 行 D:\PHP\tr.php 中准备好的语句中的参数数不匹配
如here at the end of the page. 所述,我知道 PDO 支持,但也许正如您所料,我不是 PDO 的粉丝,所以 ;)
我的另一个选择是使用 php 中可用的eval() 变通办法,但这不是我可能想到的。
还有其他方法吗?
【问题讨论】:
-
显示您的
$query和您的$bindParams。如果你有超过 1 个任何类型,它将相互覆盖,所以你总是会得到任何类型的 1 个。 -
您不能将一个参数放在同一个呼叫的 2 个不同呼叫上。起初,每个你传递的名字都像
INSERT INTO table1 (name, age) VALUES ("hello", )和INSERT INTO table1 (name, age) VALUES (, 15)你需要把 2 个值放在同一个 -
@ManuelRodriguezGil 我知道.. 是的.. 有什么解决方法吗?因为我不能把这些价值观放在一个电话里。我从函数调用中将其作为数组接收。
-
如果
$bindParams始终具有相同的结构,您可以这样做:$stmt->bind_param('si', $bindParams["s"], $bindParams["i"]); -
@ManuelRodriguezGil 不,这正是问题所在;)例如,可以调用我的函数并将此值传递给
$bindParams:$bindParams = ["s" => "hello", "i" => 15, "s" => "world"]和$sql分别更改。
标签: php mysqli prepared-statement bindparam