【发布时间】:2018-12-10 19:36:09
【问题描述】:
mysqli_stmt 没有query_params() 函数,我必须自己编写。参数 arry 绑定到带有bind_param() 的语句。我需要动态指定变量类型。我可以这样做:
$sType = '';
foreach ($aParameters as $iIndex => $mParameter) {
if (is_string($mParameter)) {$sType .= 's';}
elseif ( is_int($mParameter)) {$sType .= 'i';}
elseif ( is_float($mParameter)) {$sType .= 'd';}
elseif ( is_null($mParameter)) {$sType .= 's';}
elseif ( is_bool($mParameter)) {
$sType .= 'i';
$aParameters[$iIndex] = boolval($mParameter);}
else {
// trow new Exception(...);
}
}
但事实证明,mysql/mariadb 会将布尔值、整数和浮点数作为字符串发送,数据库服务器会很乐意将它们转换为列的相应数据类型。看来我可以跳过这一步,默认情况下将每个参数作为字符串发送。
是否有任何理由为每个参数指定除"s" 之外的其他数据类型?
编辑:我刚刚找到this SO 主题,该主题显示了当二进制数据包超过max_allowed_packet 设置时如何使用“b”类型和mysqli_stmt::send_long_data。我还读到它会提高使用bin2hex() 将字节字符串作为文本发送的解决方案的性能。
【问题讨论】:
-
绝对没有理由这样做。原因是如果您总是希望将特定参数绑定为整数或浮点数。根据要绑定的变量的数据类型来确定要绑定的类型对 MySQL 来说毫无意义。
-
将它们全部视为
s字符串,除非您在空引用上的某些b二进制文件中进行管道处理。 -
@IncredibleHat 是的,到目前为止,这似乎是底线。谢谢!
标签: php mysql mysqli bindparam