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
),则顺序无关紧要,您只需确保有一个以命名占位符为键的关联数组