【问题标题】:Problems when binding values绑定值时的问题
【发布时间】:2017-01-26 23:28:05
【问题描述】:

我第一次使用准备好的语句,但我遇到了这个错误。由于某种原因,我不能将绑定类型作为参数传递?

我的代码:

function insert($table, $columns = array(), $bindTypes, $values = array()) {
// Store connection.
$connection = connection();
$columnValues = null;
$index = 1;

// Prepare unassigned value string.
foreach ($columns as $column) {
    $columnValues .= '?';
    if ($index < count($columns)) {
        $columnValues .= ', ';
    }
    $index++;
}

// Debugg purpose: echo query example:
echo "INSERT INTO {$table} (" . implode(', ', $columns) . ") VALUES ({$columnValues})"; 

// Prepare statement.
$statement = $connection->prepare("INSERT INTO {$table} (" . implode(', ', $columns) . ") VALUES ({$columnValues})");
$statement->bind_param($bindTypes, implode(', ', $values));
}


insert('test', array('name'), 'i', array(1));

如果我回显查询示例,我会得到“INSERT INTO test (name) VALUES (?)”。

请放过我,我还是个学习菜鸟。

【问题讨论】:

    标签: php mysqli


    【解决方案1】:

    PHP > 5.6 版本:

    function insert($connection, $table, $columns, $values) {
        $columnStr = "`".implode("`,`",$columns); 
        $valueStr =  str_repeat('?,', count($values) - 1) . '?';
        $types = str_repeat('s', count($values));
        $statement = $connection->prepare("INSERT INTO `$table` ($columnStr) VALUES ($valueStr)");
        $statement->bind_param($types, ...$values);
        $statement->execute();
    }
    
    insert($conn, 'test', ['name'], [1]);
    

    请注意,您永远不应该从用户输入中取出表或列名称,而是始终将它们硬编码在脚本中。这使得插入的独特功能变得毫无用处。

    【讨论】:

    • 注意:由于...$values 语法,PHP/5.6+ 是必需的。
    【解决方案2】:

    我们来看看the docs

    bool mysqli_stmt::bind_param ( 字符串 $types , 混合 &$var1 [, 混合 &$... ] )

    换句话说,第一个参数确定数据类型,并且您从第二个参数开始将值作为单独的参数传递。但是你有这个:

    $statement->bind_param($bindTypes, implode(', ', $values));
    

    您将所有单独的值组合成一个以逗号分隔的字符串,这没有任何意义,尤其是。如果您认为该函数需要 reference 的参数。

    【讨论】:

    • 谢谢。我现在看到了问题,但我无法提出解决方案。
    • @DennisCastelijns 你使用的是什么 PHP 版本?
    • @YourCommonSense 5.5.9
    • @DennisCastelijns 很遗憾。无论是 5.6,都会有一个简单的解决方案
    • 我对mysqli不是很熟悉。如果你不能多次调用bind_param(),你可能不得不使用call_user_func_array(),这是相当丑陋的。
    【解决方案3】:

    我看到你用 MySQLi 标记了你的帖子,我很确定这是这里的问题。

    相反,我会在这个上使用 PDO,因为它允许以更简单的方式使用可变数量的参数。允许您执行与 PHP 手册中的 example 5 非常相似的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      相关资源
      最近更新 更多