Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.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异常:SQLSTATE[HY093]_Php_Mysql_Pdo - Fatal编程技术网

PHP异常:SQLSTATE[HY093]

PHP异常:SQLSTATE[HY093],php,mysql,pdo,Php,Mysql,Pdo,我的问题是: $query = 'INSERT INTO ptd_users (username,contact,email,longitude,latitude,state,city,address) values (?,?,?,?,?,?,?,?)'; $q = $conn->prepare($query); $q->execute($_POST['user']); 打印的结果($\u POST[user]): 执行查询时出现以下错误: PDOException:SQLSTAT

我的问题是:

$query = 'INSERT INTO ptd_users (username,contact,email,longitude,latitude,state,city,address) values (?,?,?,?,?,?,?,?)';
$q = $conn->prepare($query);
$q->execute($_POST['user']);
打印的结果($\u POST[user])

执行查询时出现以下错误:

PDOException:SQLSTATE[HY093]:无效参数编号:未定义参数


您只能将1个参数绑定到8个占位符,所以这是行不通的。现在有3种方法可以解决这个问题:

一,。访问单个数组元素并按如下方式绑定它们:

$q->execute($_POST['user']['name'], $_POST['user']['contact'], $_POST['user']['email'], $_POST['user']['longitude'], $_POST['user']['latitude'], $_POST['user']['state_select'], $_POST['user']['city_select'], $_POST['user']['address'] );
$query = "INSERT INTO ptd_users (username,contact,email,longitude,latitude,state,city,address) values (:name, :contact, :email, :longitude, :latitude, :state_select, :city_select, :address)";
$q->execute($_POST['user']);
$query = 'INSERT INTO ptd_users (username,contact,email,longitude,latitude,state,city,address) values (?,?,?,?,?,?,?,?)';
$q->execute(array_values($_POST['user']));
二,。使用具有以下名称的占位符:

$q->execute($_POST['user']['name'], $_POST['user']['contact'], $_POST['user']['email'], $_POST['user']['longitude'], $_POST['user']['latitude'], $_POST['user']['state_select'], $_POST['user']['city_select'], $_POST['user']['address'] );
$query = "INSERT INTO ptd_users (username,contact,email,longitude,latitude,state,city,address) values (:name, :contact, :email, :longitude, :latitude, :state_select, :city_select, :address)";
$q->execute($_POST['user']);
$query = 'INSERT INTO ptd_users (username,contact,email,longitude,latitude,state,city,address) values (?,?,?,?,?,?,?,?)';
$q->execute(array_values($_POST['user']));
然后您可以像这样使用关联数组:

$q->execute($_POST['user']['name'], $_POST['user']['contact'], $_POST['user']['email'], $_POST['user']['longitude'], $_POST['user']['latitude'], $_POST['user']['state_select'], $_POST['user']['city_select'], $_POST['user']['address'] );
$query = "INSERT INTO ptd_users (username,contact,email,longitude,latitude,state,city,address) values (:name, :contact, :email, :longitude, :latitude, :state_select, :city_select, :address)";
$q->execute($_POST['user']);
$query = 'INSERT INTO ptd_users (username,contact,email,longitude,latitude,state,city,address) values (?,?,?,?,?,?,?,?)';
$q->execute(array_values($_POST['user']));
三,。使用如下位置占位符:

$q->execute($_POST['user']['name'], $_POST['user']['contact'], $_POST['user']['email'], $_POST['user']['longitude'], $_POST['user']['latitude'], $_POST['user']['state_select'], $_POST['user']['city_select'], $_POST['user']['address'] );
$query = "INSERT INTO ptd_users (username,contact,email,longitude,latitude,state,city,address) values (:name, :contact, :email, :longitude, :latitude, :state_select, :city_select, :address)";
$q->execute($_POST['user']);
$query = 'INSERT INTO ptd_users (username,contact,email,longitude,latitude,state,city,address) values (?,?,?,?,?,?,?,?)';
$q->execute(array_values($_POST['user']));
然后可以将关联数组更改为数字数组,如下所示:

$q->execute($_POST['user']['name'], $_POST['user']['contact'], $_POST['user']['email'], $_POST['user']['longitude'], $_POST['user']['latitude'], $_POST['user']['state_select'], $_POST['user']['city_select'], $_POST['user']['address'] );
$query = "INSERT INTO ptd_users (username,contact,email,longitude,latitude,state,city,address) values (:name, :contact, :email, :longitude, :latitude, :state_select, :city_select, :address)";
$q->execute($_POST['user']);
$query = 'INSERT INTO ptd_users (username,contact,email,longitude,latitude,state,city,address) values (?,?,?,?,?,?,?,?)';
$q->execute(array_values($_POST['user']));

尝试执行(数组($\u POST['user']['name'],$\u POST['user']['contact'],…,$\u POST['user']['address'])将此
..
替换为$\u POST:)的其余部分,该数组与
$\u POST['user']
的数组相同mysqli@lmarcelocc当前位置如果一个人有大量的后VAR,那不是很痛苦吗?@popla,是的!但是您可以构造一个数组,然后在
$q->execute($myArray)中发送它方法。而且,如果您希望使用其他类型的字符串,那么只需使用
strings
,这是一个很好的做法,可以像
$conn->bindParam(2,$\u POST['user']['contact'],PDO::PARAM_INT)那样绑定它们
但是@Rizier123示例提供了一个更好的视角:)像“(?,?,?,?,?,,?,,?,?,?,?,?,?)”这样的未命名占位符有什么问题?@popla Nothing,但是如果使用关联数组,它如何知道哪个数组元素应该与哪个占位符绑定?!这就是为什么必须使用每个元素作为单个参数,或者使用带有名称的占位符,以便它可以使用数组的索引来绑定听起来合理的值。但是还有一个小问题,我的意思是,在什么情况下会使用未命名的占位符?我是PDO的新手,澄清这一点对我很有帮助。谢谢。我试过第二种方法。但这是在我的表中按原样插入“:name”、“:contact”、“:email”、“:longitude”、“:state_select”、“:city_select”、“:address”。@popla这是个好问题:D如果使用位置占位符(
),那么绑定参数的顺序很重要!所以绑定的第一个值将替换为第一个问号,依此类推。。。如果使用命名占位符(
:name
),则顺序无关紧要,您只需确保有一个以命名占位符为键的关联数组