PHP mysqli bind_param类型用于文本

时间:2011-06-18 16:49:45

标签: php mysqli

对于将用户注释转储到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类型的处理方式不同 - 我应该知道什么?

由于

2 个答案:

答案 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_mergearray_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列中获得空单元格。