Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用准备好的语句时预定义语句_Php_Mysql - Fatal编程技术网

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

Php 使用准备好的语句时预定义语句,php,mysql,Php,Mysql,首先,如果我的标题不能很好地解释这种情况,我很抱歉,我想不出一个好的标题。 我试图从一个表单中获取所有输入,并将它们放入数据库。我现在不是100%确定这是否可行,但我想我会把它贴出来确认一下。代码被注释了,但是我得到了 INSERT INTO items (title, description, category, size) VALUES (?, ?, ?, ?) 'ssss', $fields[0][1], $fields[1][1], $fields[2][1], $fields[3][1

首先,如果我的标题不能很好地解释这种情况,我很抱歉,我想不出一个好的标题。
我试图从一个表单中获取所有输入,并将它们放入数据库。我现在不是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();
/$fields[x][0]是x的标题,$fields[x][1]是x的值
$statement='插入项目(';
//添加所有字段名
对于($i=0;$i;
//将所有值类型添加到语句中
$params='\'';
对于($i=0;$istmt_init();
$stmt->prepare($statement);
$stmt->bind_param($params);
$stmt->close();
$db->close();
来自:

bool mysqli_stmt::bind_参数(字符串$types,mixed&$var1[,mixed&$…])


参数必须作为单个参数传递。

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

你在打电话吗

$stmt->bind_param($params);
因此,您应该将类型放在单独的变量中,而不是$params中,并按如下方式调用它:

$stmt->bind_param($types,$params);
请记住,总的来说,这对我来说是个坏主意。由于items表有一个特定的模式,您可能应该有一个硬编码的query和types变量,只需将值以所需的格式放入params数组


您将拥有更干净的代码,并且不必处理格式错误的字段数组。

我认为这将是我将得到的响应,因此我必须坚持常规查询。我确实知道将其作为参数传递,我只是想有一种方法可以用它的值替换
$params
(因此它工作正常,ish)。
$stmt->bind_param($types,$params);