草庐IT

带有变量的 Php mysql select 语句(无效参数编号 : number of bound variables does not match number of tokens)

coder 2023-10-18 原文

需要根据用户输入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/

有关带有变量的 Php mysql select 语句(无效参数编号 : number of bound variables does not match number of tokens)的更多相关文章

随机推荐