1

こんにちは、私はこのサイトで助けを求めてたくさん検索しましたが、もっと検索すると混乱します。

フィールドID (主キー)プレーヤー*チーム名 * (チーム内の 3 人のプレーヤー) とスコア(プレーヤー)があるテーブル競技が 1 つあります。

      competition                     TeamCompetition

Player : TeamName : Score       :  TeamName  :  TeamScore
------ : -------- : -----       :  ----------------------
 Tom   :   team1  :   50        :   team1    :  50+66+35=151
Brian  :   team1  :   66        :   team2    :  54+85+...etc
 Tim   :   team1  :   35        :   
Calvin :   team2  :   54        :
Jerry  :   team2  :   85        :

SQLのようにSUMを作成することができました:

$result1 = mysql_query("SELECT SUM(Score) AS team1 FROM competition WHERE TeamName='team1' ");

その変数 $team1 を TeamCompetition と呼ばれる新しいテーブルに保存しようとしましたが、1 つのチームの合計がチームの名前を持つ 1 つの数字のように保存されます

$row1= mysql_fetch_array($result1);

$team1= $row1['team1'];

$sql1=("INSERT INTO TeamCompetition (TeamScore)
        VALUES '$_POST[team1]' 
        WHERE TeamName='team1' ");

しかし、それはうまくいきません。誰かがこのコードを処理する方法を提案できますか、またはそれを解決する別のよりエレガントな方法はありますか? $sql1 なしでエコーすると、結果が表示されますが、なぜ保存できないのでしょうか...?

4

2 に答える 2

3

SQL 構文の問題に対する基本的な解決策は次のとおりです。

$sql1=("INSERT INTO TeamCompetition (TeamScore, TeamName)
    VALUES ('".$_POST[team1]."','team1'");

DB には現在、チーム名を持つ行がないため、作成する必要があります。また、$_POST は配列であり、評価されたスクリプトでは適切に処理されないことに注意してください。

ただし、スコアを取得したら、これを更新したいと思います。

$sql1=("UPDATE TeamCompetition set TeamScore = '".$_POST[team1]."'
    WHERE TeamName = 'team1'");

しかし、MySQL にはINSERT.... ON DUPLICATE KEY UPDATE機能という巧妙なトリックがあります。

$sql1=("INSERT INTO TeamCompetition (TeamScore, TeamName)
    VALUES ('$_POST[team1]','team1'
    ON DUPLICATE KEY UPDATE TeamScore = '".$_POST[team1]."'" );

ただし、1 つだけ避けられないことがあります。このコードは SQL インジェクションの匂いがします。

  • PDOを使用するか(一般的に最適なソリューション)
  • および/または、信頼されていない、または検証せずに操作しやすいソースからのデータを使用せず、適切に処理します (悪い解決策ですが、何もしないよりはましです)。

このコードを最小限の労力で保護するには (これらの関数が引き続きサポートされている限り、すばらしい NullPointer によって示されます)、mysql_real_escape_stringを使用できますが、それでも、この全体は非推奨になるため、新しい開発には使用しないでください。

$sql1=("INSERT INTO TeamCompetition (TeamScore, TeamName)
    VALUES ('".mysql_real_escape_string($_POST[team1])."','team1'
    ON DUPLICATE KEY UPDATE TeamScore = '".$_POST[team1]."'" );

したがって、古いコードにパッチを適用する必要がある場合、それがそのまま維持される場合は、これを使用することを決定できますが、PDO を使用する可能性を評価した後でのみです! PDO を使用する可能性がわずかしかない場合は、それが方法です (PHP PDO ドキュメントの厚意により):

<?php
try {
    //open connection, this is different than in the old functions
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

    //***running query
    //**step1: create statement
    $stmt = $dbh->prepare("INSERT INTO TeamCompetition (TeamScore, TeamName)
    VALUES (:teamScore,:teamName)
    ON DUPLICATE KEY UPDATE TeamScore = :teamScore "); //notice parameters prefixed with ':'

    //**step2: bind values
    $stmt->bindValue(':teamScore', $_POST[team1]);
    $stmt->bindValue(':teamName', 'team1');

    //**step3: exexcute statement
    $stmt->execute();

    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}
?> 
于 2013-02-22T11:10:31.257 に答える
3

一羽の鶏の急襲ですべてを行うことができます。PHP 経由で情報を渡す必要はまったくありません。

INSERT INTO TeamCompetition (TeamName, TeamScore) VALUES (SELECT TeamName, SUM(Score) FROM competition GROUP BY TeamName)

入力を検証する必要があり、コードはSQLインジェクションチェックに脆弱です PHPでSQLインジェクションを防ぐ方法は?

mysql_*新しいコードで関数を使用しないでください。それらはもはや保守されておらず、公式に非推奨です。代わりに準備済みステートメントについて学び、 PDOまたはMySQLiを使用してください

于 2013-02-22T11:11:24.767 に答える