需要根据用户输入SELECT mysql 数据。
例如,在输入表单(字段)中,用户输入日、月、年。并且需要获取(fetch)与输入的年月日匹配的mysql数据。
这是我的代码:
if (strlen($_POST['date_day'] > 0)) {
$post_date_day = $_POST['date_day'];
$date_day = 'RecordDay = ?';
}
if (strlen($_POST['date_month'] > 0)) {
$post_date_month = $_POST['date_month'];
$date_month = ' and RecordMonth = ?';
}
if (strlen($_POST['date_year'] > 0)) {
$post_date_year = $_POST['date_year'];
$date_year = ' and RecordYear = ?';
}
if ( strlen( $_POST['date_day'] or $_POST['date_month'] or $_POST['date_year'] ) > 0 ) {
$where = 'WHERE';
}
$sql_prepare = $where .$date_day .$date_month .$date_year;
$sql_execute = array($post_date_day, $post_date_month, $post_date_year);
$sql = $db->prepare("SELECT * FROM 2_1_journal $sql_prepare ");
$sql->execute($sql_execute);
如果 $_POST['date_day'] 和 $_POST['date_month'] 以及 $_POST['date_year'] 的 strlen 大于 0,则脚本有效。
但是,例如,如果用户将年份留空(因为想要查看匹配日期和月份的所有结果),我会收到错误 SQLSTATE[HY093]: 参数编号无效:绑定(bind)变量的数量与编号不匹配代币数量。
不明白为什么不匹配 token 数。因为
if (strlen($_POST['date_year'] > 0)) {
$post_date_year = $_POST['date_year'];
$date_year = ' and RecordYear = ?';
}
我想 if (strlen($_POST['date_year'] == 0) then $post_date_year 和 $date_year 是空白的;所以没有变量,也没有标记。
可能是我的解决方法不对,有一些好的工作方法......
最佳答案
您会发现创建动态查询以在参数可用时添加到基本查询会更容易。在第一个参数之后使用标志从 WHERE 切换到 AND。该值同时添加到数据数组中。
如果没有传递参数且 $data[] 为空,则添加错误捕获。
$post_date_day =$_POST['date_day'];
$post_date_month = $_POST['date_month'];
$post_date_year = $_POST['date_year'];
$data = array();
$query = "SELECT * FROM 2_1_journal";
$flag = 0;//Set as WHERE
if (strlen($post_date_day)> 0) {
$query = $query." WHERE RecordDay = ?";
$data[] = $post_date_day;//Add to array
$flag = 1;//Switch to AND
}
if (strlen($post_date_month) > 0) {
if($flag ==0){
$query.= " WHERE RecordMonth = ?";
$flag = 1;//Switch to AND
}else{
$query.= " AND RecordMonth = ?";
}
$data[] = $post_date_month;//Add to array
}
if (strlen($post_date_year) > 0) {
if($flag ==0){
$query.= " WHERE RecordYear = ?";
}else{
$query.= " AND RecordYear = ?";
}
$data[] = $post_date_year;//Add to array
}
$sql = $db->prepare($query);
if (empty($data)){//If no parameters passed
$sql->execute();
}else{
$sql->execute($data);
}
关于带有变量的 Php mysql select 语句(无效参数编号 : number of bound variables does not match number of tokens),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17136621/