对于将用户注释转储到MySQL表的反馈表单,我不确定哪个bind_param类型用于用户提供的反馈文本(MySQL字段类型=文本)
function sql_ins_feedback($dtcode,$custip,$name,$email,$subject,$feedback)
{
global $mysqli ;
if($stmt = $mysqli->prepare("INSERT INTO feedback (dtcode,custip,name,email,subject,feedback) VALUES (?,?,?,?,?,?)"))
{
$stmt->bind_param("ssssss", $dtcode,$custip,$name,$email,$subject,$feedback);
$stmt->execute() ;
$stmt->close() ;
}
}
还是这个?
$stmt->bind_param("sssssb", $dtcode,$custip,$name,$email,$subject,$feedback);
那么,blob类型是文本字段的正确bind_param类型吗?
bind_param(“s”)类型的大小限制是什么?
使用bind_param(“b”)时还有什么必须做的吗?手册(以及我在某处/某处读过的其他内容)表明blob类型的处理方式不同 - 我应该知道什么?
由于
答案 0 :(得分:9)
这实际上取决于Mysql服务器。整个查询中组合的所有数据的默认最大大小为1mb。请参阅:http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html
如果您的数据合并在"max_allowed_packet"阈值之下,只需使用“s”作为任何文本字段的绑定类型。事实上,你通常可以使用“s”来表示任何字段类型(日期,浮动等)。
如果您要插入的整个条目组合长度超过1mb(或者重置它的任何内容),您将需要使用mysqli_stmt::send_long_data方法和“b”绑定类型来发送此特定内容大块的领域。
答案 1 :(得分:0)
对于那些想要使用mysqli的bind_param('ssbss', $data)
的人,你应该使用bind_param('sssss')
,而你正在进行UPDATE或INSERT。这样你可以动态替换所有?在准备好的查询中,值存储在数组中:
call_user_func_array(array($stmt, 'bind_param'), makeValuesReferenced($typeValues));
$typeValues
是使用array_merge
或array_unshift
通过数组('sssss')和数组(var1的引用,var2的引用,...)合并的数组;
makeValuesReferenced:
/**
* All prepared variables' references are needed by function bind_param
* @param &$arr: array constituted of types and values
*/
function makeValuesReferenced(&$arr){
$refs = array();
foreach($arr as $key => $value) {
// Param 1 of bind_param only needs value of types array
if($key === 0) {
$refs[$key] = $arr[$key];
} else {
$refs[$key] = &$arr[$key];
}
}
return $refs;
}
使用bind_param('ssbss',$ data)只会在blob列中获得空单元格。