2016-06-18 8 views
0

私はSQL構文に驚くほど良くはありません。この問題に関する私の研究から、データベースクエリから列を除外する例が出てきましたが、実際の結果は返されませんでした。SELECTクエリの特定のSQL結果を省略します。

PHPスクリプトは、SQLクエリの下に実行されている:

$query = $db->query("SELECT `team`, `points`, `goalsfor`, `goalsagainst`, `goalsdifference`, `matches`, `wins`, `draws`, `losses` FROM `".TABLE_PREFIX."myleagues_rows` WHERE `league` = {$lid} ORDER BY `points` DESC, `goalsdifference` DESC, `goalsfor` DESC, `goalsagainst` ASC"); 

それは再びそれを参照すると、クエリの次の部分、フォーマットされたHTMLテーブルにデータを挿入します。

while($row = $db->fetch_array($query)) { 
     foreach($row as $name => $value) { 
      $teams[$row['team']][$name] = $value; 

私が重要なことを忘れている場合は、Full linkをPHPファイルに追加してください。

私の質問は、返され、書式設定されたテーブルに挿入されるチーム名 "Test"でそのテーブルに行があることです。私はデータベースからテストチームを削除したくないですが、私はフォーマットされたテーブルから除外したいと思います。

SQLクエリを変更するのに最適ですか?それとも、私が代わりにできることのPHP側に何かがありますか?

私は間違った場所を探している場合は、アドバイスありがとう、正しい方向に私を指摘してください、私は(明らかに)コードを記述していない。

答えて

0

あなたは声明WHEREでSQLクエリから削除することができます(私は「チーム」を推測しているが、名前ですか?):

$query = $db->query("SELECT 
    `team`, 
    `points`, 
    `goalsfor`, 
    `goalsagainst`, 
    `goalsdifference`, 
    `matches`, 
    `wins`, 
    `draws`, 
    `losses` 
FROM `".TABLE_PREFIX."myleagues_rows` 
WHERE 
    `league` = {$lid} 
    AND `team` != 'test' 
ORDER BY 
    `points` DESC, 
    `goalsdifference` DESC, 
    `goalsfor` DESC, 
    `goalsagainst` ASC"); 
0

あなたが観察してきたように、ここでは2つの異なるオプションがあります:変更は、結果を処理するPHPを変更したりすることができます。データベースクエリを変更する

は、次のようになりますWHERE句に追加の用語を追加するのと同じくらい簡単です:

SELECT 
    `team`, 
    `points`, 
    `goalsfor`, 
    `goalsagainst`, 
    `goalsdifference`, 
    `matches`, 
    `wins`, 
    `draws`, 
    `losses` 
FROM 
    `{{TABLE_PREFIX}}myleagues_rows` 
WHERE 
    `league` = {{$lid}} AND 
    `team` <> 'Test' 
ORDER BY 
    `points` DESC, 
    `goalsdifference` DESC, 
    `goalsfor` DESC, 
    `goalsagainst` ASC 
; 

また、あなたがifステートメントを追加することで、このチームを除外するためにPHPを変更できます。

while($row = $db->fetch_array($query)) { 
    if ($row['team'] !== 'Test') { 
     foreach($row as $name => $value) { 
      $teams[$row['team']][$name] = $value; 
     } 
    } 
} 

これはどれがベストですか?あなたが直面する問題は、「テスト」チームを除外するコードが、チームのリストを照会するたびに何度も何度も何度も何度も起き続けることです。

  • よりもむしろ、そのようなDoctrineとしてオブジェクト・リレーショナル・マッパー(ORM)のいくつかの並べ替えを使用しない理由データベース、反対生のクエリを作る:あなたはおそらく、より高いレベルの抽象化にこのコードをプッシュしたいですか? - テスト行を除いた行がコード の1行になる代わりに、 "チーム"モデルをクエリするたびにテスト行を除外することができます
  • また、ロジックをデータベースにプッシュすることもできますテスト行を除外するビューを作成します。基礎となる表ではなく、新しいビューに対して問合せを実行できます。これは、おそらく "TABLE_PREFIX"メカニズムを使用して簡単に行うことができます。

私が書いている間に、あなたがデータベースに渡している値が適切に検証されていることを確認する価値があります。文字列を連結してデータベース照会を組み立てることは、通常、悪影響を受ける可能性があるため、SQL Injection攻撃の脆弱性がある可能性があります。ORMルートを使用したくない場合は、Prepared Statementsを受け入れるデータベースライブラリに切り替えることを検討する必要があります。ごくわずかなこととして、確かに$lidが期待どおりの範囲の整数値であることを確認する必要があります。

+0

2番目の例では、 "test"という値を持つフィールドを除いて "test" -recordのすべての列を彼に渡しませんか?そして、iitは、 "Test"チームだけでなく、 "Test"を含む他のレコードの他の列も無視します。 –

+0

@MagnusEriksson良い点 - 修正されます。 – simpleigh

+0

@MagnusErikssonそれは公正な批判ですが、クエリがほとんどないアプリケーションは多くのクエリを持つアプリケーションに進化する可能性があり、遅すぎると後戻りする可能性があります。また、$ lidによって潜在的なSQLiベクタを回避できます。 – simpleigh

関連する問題