【问题标题】:PHP mysqli bind_param type for textPHP mysqli bind_param 文本类型
【发布时间】:2023-03-25 10:18:01
【问题描述】:

对于将用户 cmets 转储到 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 类型进行不同的处理——我应该知道什么?

谢谢

【问题讨论】:

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

标签: php mysqli


【解决方案1】:

这实际上取决于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”绑定类型来发送此特定字段块。

【讨论】:

    【解决方案2】:

    对于那些想要使用 mysqli 的bind_param('ssbss', $data) 的人,您应该在执行 UPDATE 或 INSERT 时使用 bind_param('sssss')。这样您就可以动态替换所有 ?在准备好的查询中,将值存储在数组中:

    call_user_func_array(array($stmt, 'bind_param'), makeValuesReferenced($typeValues));
    

    $typeValues 是使用array_mergearray_unshift 通过array('sssss') 和array(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 列中得到空单元格。

    【讨论】:

      猜你喜欢
      • 2012-11-15
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多