2017-04-06 15 views
0

私はカーシェアリングベンチャーのためのWebアプリケーションとバックエンドDBを作成しています。現時点で予約されていない車の検索結果のみが表示されるようにしたい。私は以下の質問をタイプアップしましたが、それが正しいかどうかわかりません。私は予約と車という2つの関係を使用しています。システムタイムスタンプ付きネストされたSQLクエリ

Reservations(R_No, M_ID, VIN, A_Code, start_time, end_time) 
Cars(VIN, make, model, year, P_address, r_fee) 

これは有効なクエリですか?そうでない場合、それは何を有効にするでしょうか?

$sql = "SELECT make, model, year, P_address, r_fee, VIN 
        FROM `Cars`, `Reservations` 
        WHERE (
          (make LIKE %'$search'%) or 
          (model LIKE %'$search'%) or 
          (year LIKE %'$search'%) or 
          (P_address LIKE %'$search'%) or 
          (r_fee LIKE %'$search'%) and 
      (Cars.VIN != Reservations.VIN) 
     AND (
      SELECT start_time, end_time 
      FROM Reservations 
      WHERE end_time <= SYSDATETIME() <= start_time));" 
+0

特定の車が予約テーブルの何かに一致しない場合は、どうすれば予約可能でしょうか? –

+0

'これは有効なクエリですか' ...試しても実行されないので、無効です。 –

+0

まず、% '$ search'%の代わりに '%$ search%'となります。第二に、クエリはSQLインジェクションにsuseptableです。パラメータ化されたクエリを使用します。 –

答えて

0

これは、パラメータ化されたクエリを使用するように変更する必要があり、SQLインジェクションの対象となります。

$sql = "SELECT c.`make`, c.`model`, c.`year`, c.`P_address`, c.`r_fee`, c.`VIN` 
    FROM `Cars` c 
    LEFT JOIN `Reservations` r 
    ON c.`VIN` = r.`VIN` AND TIMESTAMP BETWEEN r.`end_time` AND r.`start_time` 
    WHERE (
      (c.`make` LIKE '%$search%') or 
      (c.`model` LIKE '%$search%') or 
      (c.`year` LIKE '%$search%') or 
      (c.`P_address` LIKE '%$search%') or 
      (c.`r_fee` LIKE '%$search%') 
     ) 
     AND r.`id` IS NULL;"; 

これは、現在予約を持っていない車のリストを返します。しかし、あなたは本当に始まりと終わりの時間を 期間に延長したいので、すぐに始まる予約を持っている車を手に入れることはできません。

+0

スローン、助けてくれてありがとう! – mathStudent1936

関連する問題