使用预准备语句时的预定义语句

时间:2012-02-19 16:30:37

标签: php mysql

首先,对不起,如果我的标题不能说明情况,我就会想到一个好的标题 我正在尝试从表单中获取所有输入并将它们放入数据库中。如果这是可能的话,我现在不是100%肯定,但我想我会发布它以确保。代码已注释,但我得到了

INSERT INTO items (title, description, category, size) VALUES (?, ?, ?, ?)
'ssss', $fields[0][1], $fields[1][1], $fields[2][1], $fields[3][1]
Warning: Wrong parameter count for mysqli_stmt::bind_param()

我猜这是因为我传递变量,而不是它的值。但即使我确实传递了它的价值,不管它的好代码是否值得怀疑。

        // $fields[x][0] is title of x, $fields[x][1] is value of x
        $statement = 'INSERT INTO items (';
        // Add all the field names
        for ($i = 0; $i < count($fields) - 1; $i++) {
            $statement .= $fields[$i][0] . ', ';
        }
        $statement = $statement . $fields[count($fields) - 1][0] . ') VALUES (';
        // Add '?' for every field
        for ($i = 0; $i < count($fields) - 1; $i++) {
            $statement .= '?, ';
        }
        $statement = $statement . '?)';
        echo $statement . '<br />';
        // Add all the value types to the statement
        $params = '\'';
        for ($i = 0; $i < count($fields); $i++) {
            if (gettype($fields[$i][1]) == 'integer') {
                $params .= 'i';
            } else {
                $params .= 's';
            }
        }
        $params .= '\', ';
        // Put the values into the statement
        for ($i = 0; $i < count($fields) - 1; $i++) {
            $params .= '$fields[' . $i . '][1], ';
        }
        $i = count($fields) - 1;
        $params .= '$fields[' . $i . '][1]';
        echo $params;
        // Put it all in the database
        $db = mysqlConnect();
        $stmt = $db->stmt_init();
        $stmt->prepare($statement);
        $stmt->bind_param($params);
        $stmt->close();
        $db->close();

2 个答案:

答案 0 :(得分:0)

来自http://www.php.net/manual/en/mysqli-stmt.bind-param.php

  

bool mysqli_stmt::bind_param (string $types, mixed &$var1 [, mixed &$... ] )

参数必须作为单独的参数传递。

答案 1 :(得分:0)

来自bind_param的PHP手册:(http://php.net/manual/en/mysqli-stmt.bind-param.php)

bool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] )

您正在致电

$stmt->bind_param($params);

所以你应该将这些类型放在一个单独的变量中,而不是在$ params中,并将其命名为:

$stmt->bind_param($types,$params);

请记住,这对我来说总体上是一个坏主意。由于items表具有特定的模式,因此您应该具有硬编码查询和类型变量,并且只需将值以所需格式放入params数组中。

您将拥有更清晰的代码,无需处理格式错误的数组。