【问题标题】:Error: class to INSERT content into MySQL database错误:将内容插入 MySQL 数据库的类
【发布时间】:2017-08-27 05:16:31
【问题描述】:

我最近开始在 PHP 中使用 OOP,并且开始使用我相当熟悉的函数。我一直在研究与 MySQL 数据库连接的数据管理系统。在将内容插入数据库并收到此错误时,我遇到了问题:

Warning: mysqli_stmt::bind_param(): Number of elements in type definition string doesn't match number of bind variables ... on line 140

这是我的代码:

public function create_val( $content_array, $table )
{
    $array_num = count($content_array);

    // create value holders
    $value_param = str_repeat( '?, ', $array_num );
    $stmt_values = rtrim($value_param, ', ');

    // create bind params
    $stmt_param = str_repeat('s', $array_num);


    foreach($content_array as $key => $value)
    {
        $key_val[] = $key;
        $val[] = $value;
    }

    $table_rows = implode(', ', $key_val);
    $insert_val = implode(', ', $val);

    $sql = "INSERT " . $table . " (" . $table_rows . ") VALUES (" . $stmt_values . ")";

    if($stmt = $this->_connection->prepare( $sql ))
    {
        try
        {
            $stmt->bind_param($stmt_param, $insert_val);
            $stmt->execute();
            $stmt->close();
        }
        catch(Exception $e)
        {
            echo "There was an unexpected problem. " . $e->getMessages();
        }
    }
}

我知道错误是由这一行引起的:$stmt->bind_param($stmt_param, $insert_val);

但我就是不明白为什么;我已经检查了 $stmt_param$insert_val 并且它们的数量匹配 - 在我正在运行的这个特定尝试中。

值作为$key => $value 对插入。这是我调用类的设置:

$array = array(
    'column1' => 'an item',
    'column2' => 'a second content',
    'column3' => 'some information',
    'column4' => 'what what what???'
);
$db->create_val($array, 'table_name');

我对这个函数的目标是尽可能地重复使用和模块化。我查看了许多类似的问题,但没有找到任何我可以使用的问题。即使涉及到类,它们也不能真正用于不同的目的,而我的目的是可重用。

【问题讨论】:

  • 1.检查表格列 2.与您发送的内容进行比较 3.回显$sql 查询和 4.尝试在数据库中执行 5.告诉您遇到什么错误。
  • @AbdulWaheed 我的测试数据库有 4 列,全部为 varchar(500) 我不确定查询与实际冲突有多大关系。
  • bind_param 只适用于一次绑定一个参数。
  • @Scuzzy 我理解,但我只是尝试一次在数据库中插入 1 条记录,如果我要写 $stmt->bind_param('ssss', $item1, $item2, $item3, $item4); 就可以了
  • 首先尝试使用php.net/manual/en/pdostatement.execute.php,尤其是示例#3,首先您希望您的SQL 成为带有? 占位符的模板,然后执行函数可以按该顺序注入您的数组值。

标签: php mysql oop


【解决方案1】:

从 PHP 5.6 开始,您可以使用 unpacking operator 调用 bind_param 函数,这样您就可以直接调用它(而不使用 call_user_func_array),只需更改此行...

$stmt->bind_param($stmt_param, ...$val);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 2015-12-13
    • 2013-01-27
    相关资源
    最近更新 更多