3

需要SELECT根据用户输入的mysql数据。

例如,在输入表单(字段)中,用户输入日、月、年。并且需要获取(获取)与输入的日月年匹配的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,则脚本有效。

但是,例如,如果用户将 year 留空(因为想要查看匹配日期和月份的所有结果),我会收到 error SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

不明白为什么不匹配令牌数。因为

if (strlen($_POST['date_year'] > 0)) {
$post_date_year = $_POST['date_year'];
$date_year = ' and RecordYear = ?';
}

我想如果 (strlen($_POST['date_year'] == 0) 那么 $post_date_year 和 $date_year 是空白的;所以没有变量,也没有令牌。

可能我获得解决方案的方法是错误的,并且有一些好的工作方法.....

4

2 回答 2

4

当参数可用时,您会发现创建动态查询以添加到基本查询时会更容易。在第一个参数之后使用标志从 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); 
}
于 2013-06-16T20:24:36.990 回答
1

这是因为您以错误的方式使用圆括号

(strlen($_POST['date_year'] > 0))

你应该计算后变量,所以$_POST['date_year']用圆括号括起来,然后比较0

(strlen($_POST['date_year']) > 0)
于 2013-06-16T19:02:42.787 回答