2011-06-18 89 views
6

对于反馈形式,将转储用户注释到一个MySQL表,我不能确定为用户提供反馈的文本使用哪种类型bind_param(MySQL的字段类型=文本)PHP的mysqli bind_param类型文本

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

数据库中该字段的列类型是什么? – hakre

回答

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”绑定类型以块形式发送此特定字段。

+0

这就是我正在寻找的信息。谢谢。 – user674073

0

对于那些想要使用mysqli的bind_param('ssbss', $data)你应该使用bind_param('sssss'),而你正在进行更新或插入。这样你可以动态地取代所有?在与值准备好的查询存储在数组中:

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',$数据),你将只能得到在BLOB列空单元格。