2016-04-27 5 views
1

毎週メンバーの更新を自動化するための編集可能なデータベースを作成しました。各メンバーが毎週更新する9つの値があり、これらはセカンダリPHPへの$ _POSTによって制御されます。私はisset()を使ってmysqlクエリの実行を制御することができます

このPHPから、post値はphp varとして設定され、次にSQL dbを更新するために使用されます。

mysql_select_db("web_footy1") or die(mysql_error()); 




// The SQL statement is built 
$strSQL = "UPDATE Round_6 SET "; 

$strSQL = $strSQL . "Game1= '$Game1', "; 

$strSQL = $strSQL . "Game2= '$Game2', "; 

$strSQL = $strSQL . "Game3= '$Game3', "; 

$strSQL = $strSQL . "Game4= '$Game4', "; 

$strSQL = $strSQL . "Game5= '$Game5', "; 

$strSQL = $strSQL . "Game6= '$Game6', "; 

$strSQL = $strSQL . "Game7= '$Game7', "; 

$strSQL = $strSQL . "Game8= '$Game8', "; 

$strSQL = $strSQL . "Game9= '$Game9' "; 

$strSQL = $strSQL . "WHERE Member = '$Member' "; 

// The SQL statement is executed 
mysql_query($strSQL) or die(mysql_error()) ; 

はい、私はこれはSQLインジェクションの対象と認識しています、それは、ATM

を待つことができるセキュリティので、問題はすべての値が同時に更新され、1を更新することにあるプライベートサイトですすべてを入力する必要があります。それ以外の場合は空の値に置き換えられます。

私の質問は2倍です。 A)各変数を別々に制御できる最もきれいな方法は何ですか? B)実行するクエリを制御するためにisset($ GameX)を使用する方法はありますか?

例:

IF (isset($Game1)) {UPDATE Round6 SET Game1='$Game1' WHERE Member='$Member'} ; 

、心に留めておく3週間前、私はコーディングについて何も知りませんでしたし、その時には、HTML、PHPとSQLでcoursedクラッシュを持ってください...乾杯

答えて

1

私は本当に実際にはあなたは十分にお勧めできませんFIXあなたのSQLインジェクション。

これは言い換えれば、プログラムで条件をUPDATE句に追加することができます。私はそこのトップ変数のアップカップルに置かれている

<?php 

$Game3 = "things"; 
$Game5 = "stuff"; 
$Game6 = "awesome"; 
$Member = 'ben'; 

$update_parts = array(); 
for ($game_counter = 1; $game_counter < 10; $game_counter++) { 
    $variable_name = "Game" . $game_counter; 
    if (isset($$variable_name)) { // This is like isset($Game1) 
     $update_parts[] = "Game" . $game_counter . " = '" . $$variable_name . "'"; 
    } 
} 

if (sizeof($update_parts) > 0) { 
    $strSQL = "UPDATE Round_6 SET "; 
    $strSQL .= implode(", ", $update_parts); 
    $strSQL .= " WHERE Member = '$Member'"; 
    echo $strSQL; 
} 

: の例では、次のスニペットかもしれません。

UPDATE Round_6 SET Game3 = 'things', 
    Game5 = 'stuff', Game6 = 'awesome' WHERE Member = 'ben' 

EDIT:これは、次のSQLを生成しますが、PDOを使用する場合は、クエリと分離パラメータを必要としています。以下の私の例では、クエリのパラメータを入れています。

$conn = new PDO("mysql:host=localhost;dbname=database;","username","password"); // Your Connection String 

$update_parts = array(); 
$query_params = array(); 
for ($game_counter = 1; $game_counter < 10; $game_counter++) { 
    $variable_name = "Game" . $game_counter; 
    if (isset($$variable_name)) { // This is like isset($Game1) 
     $update_parts[] = "Game" . $game_counter . " = ?"; 
     $query_params[] = $$variable_name; 
    } 
} 

if (sizeof($update_parts) > 0) { 
    $strSQL = "UPDATE Round_6 SET "; 
    $strSQL .= implode(", ", $update_parts); 
    $strSQL .= " WHERE Member = ?"; 
    $query_params[] = $Member; 

    // Here is where you'd run the update 
    $stmt = $conn->prepare($strSQL); 
    $stmt->execute($query_params); // Notice I'm passing in the parameters separately 
} 
+0

ゲームデータを配列に格納する方が良いということを忘れてしまいました。そのようにすれば、変数変数( '$$'構文)よりもはるかに良く、より洗練された 'array_key_exists'を使用することができます – Ben

+0

これは、出力の面でかなり好きなようです... Yiur suqqestion on SQL injection修正はPDOに置くことです、私はまだ私の周りを包み込むことを試みています...上記の例をpdoで表示できますか...私はチェックしてmysqlサーバはv 5.5+です –

+0

私の編集を参照してください - PDOの例に追加 – Ben

関連する問題