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 より大きい場合、スクリプトは機能します。

しかし、たとえば、ユーザーが年を空白のままにすると (日と月に一致するすべての結果を表示したいため)、エラーが発生します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 = ?';
}

if (strlen($_POST['date_year'] == 0) then $post_date_year と $date_year は空白なので、変数もトークンもありません。

解決策を得る私の方法が間違っている可能性があり、いくつかの良い作業方法があります.....

4

2 に答える 2

1

これは、丸括弧を間違った方法で使用しているためです。

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

ポスト変数をカウントする必要があるため$_POST['date_year']、丸括弧で囲んでから比較します0

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