0

基本的に、GETを介して渡されたクライアントのクライアントがあり、アカウントの配置日(dateplaced)がカレンダーフィールドからGETを介して渡された開始日と終了日の間にあるdbaseテーブルからアカウント情報を取得する必要があります。

以下のクエリは行を返しません。クエリのSELECT部分​​とFROM部分が意図したとおりに機能し、クライアントのGETからの選択が正常に機能することを確認したため、日付の問題が残ります。「dateplaced」は、「dd / mm/yyyy」形式のvarcharとしてデータベースに保存されます。調べてみると、mysqlは「yyyy-mm-dd」形式の日付を必要としていることがわかりました。GETデータからの比較の2つの部分をつなぎ合わせて、正しくフォーマットされていることをかなり確信しています。str_to_date()の代わりに「dateplaced」を単純に使用してみましたが、機能しませんでした。そのため、以下に示すようにstr_to_date()を試しましたが、それでも機能しません。

誰かが私の問題をここで見つけることができますか?これは私を狂わせています。

$query = mysql_query("SELECT accountnumber, firstname, middlename, lastname, currentbalance FROM dbase WHERE clientname = '" . $_GET['client'] . "' AND str_to_date(dateplaced, '%Y-%m-%d') BETWEEN '" . $_GET['calendar_start_year'] . "-" . $_GET['calendar_start_month'] . "-" . $_GET['calendar_start_day'] . "' AND '" . $_GET['calendar_end_year'] . "-" . $_GET['calendar_end_month'] . "-" . $_GET['calendar_end_day'] . "' ORDER BY lastname") or die(mysql_error());
4

2 に答える 2

3

str_to_date()目的の文字列ではなく、既存の文字列の形式を取ります。str_to_date(dateplaced, '%d/%m/%Y')したがって、Ymdを取得する必要があります 。

クエリの外部で日付を作成します。デバッグが簡単です。

$clean_name=mysqli_real_escape_string($_GET['client']);
$start_date=date_create("{$_GET['calendar_start_year']}-{$_GET['calendar_start_month']}-{$_GET['calendar_start_day']}")->format('Y-m-d');
$end_date=date_create("{$_GET['calendar_end_year']}-{$_GET['calendar_end_month']}-{$_GET['calendar_end_day']}")->format('Y-m-d');

$q="SELECT accountnumber, firstname, middlename, lastname, currentbalance 
FROM dbase 
WHERE clientname = '{$clean_name}' 
  AND str_to_date(dateplaced, '%d/%m/%Y') BETWEEN '$start_date' AND '$end_date' 
ORDER BY lastname;

PS、すべての変数をクリーンアップします。エスケープする必要のある引用符やその他の文字(または邪悪なハッカーの試み)が存在する可能性があります。 mysqli_real_escape_string()あなたが使うべきものです。

于 2009-10-02T14:50:25.570 に答える
0

まず、クエリに挿入する前にユーザー変数をエスケープしないことで、SQLインジェクションに対して広く開放されています(を参照mysql_real_escape_string)。

クエリが機能しない理由は、STR_TO_DATEの2番目のパラメータには、変換しようとしている形式ではなく、ソース文字列の形式が必要なためです。

// extract variables
$client = $_GET['client'];

$startYear = $_GET['calendar_start_year'];
$startMonth = $_GET['calendar_start_month'];
$startDay = $_GET['calendar_start_day'];

$endYear = $_GET['calendar_end_year'];
$endMonth = $_GET['calendar_end_month'];
$endDay = $_GET['calendar_end_day'] ;

// parse variables
$startDate = mktime(0, 0, 0, $startMonth, $startDay, $startYear);
$endDate = mktime(0, 0, 0, $endMonth, $endDay, $endYear);

// query database
$sql = sprintf(
   "SELECT accountnumber,
           firstname,
           middlename,
           lastname,
           currentbalance
    FROM dbase
    WHERE clientname = '%s'
    AND STR_TO_DATE(dateplaced, '%d/%m/%Y') BETWEEN '%s' AND '%s'
    ORDER BY lastname",
    mysql_real_escape_string($client),
    date('Y-m-d', $startDate),
    date('Y-m-d', $endDate));

$result = mysql_query($sql) or die(mysql_error());
于 2009-10-02T14:59:06.883 に答える