0

さて、私は非常に奇妙な問題を抱えています。WoW 武器庫からデータをインポートしようとしていますが、その過程でこの情報をユーザーというテーブルの下にある自分のデータベースに追加します。

新しいメンバーを追加する際に、現在のメンバーに関するすべての情報がまだ正しいかどうかを確認します (すべての SQL インジェクションの問題を修正することは、この後で行うことに注意してください)。

@$json = file_get_contents("http://$region.battle.net/api/wow/guild/$realm/$guild?fields=members,achievements");
if($json == false)
{
throw new Exception("Failed To load infomation. check setup options");
} 
$decode = json_decode($json, true);

foreach($decode['members'] as $p) {
    $mrank = $p['rank'];
    $mname = $p['character']['name'];
    $mclass = $p['character']['class'];
    $mrace = $p['character']['race'];
    $mlevel = $p['character']['level'];
    $mgender = $p['character']['gender'];

    $check = mysql_query("SELECT * FROM user WHERE charactername='$mname'");
    if($check == false)
    { 
        die("Sql query failed"); 
    }
    if(mysql_num_rows($check) != 0)
    {
        if($mlevel !== $check['level'])
        {
            mysql_query("UPDATE user SET level='$mlevel' WHERE charactername='$mname'");
            $uCount = $uCount + 1; 
            echo "level $mname<br />"; 
        }
        if($mclass !== $check['class'])
        {
            mysql_query("UPDATE user SET class='$mclass' WHERE charactername='$mname'");
            $uCount = $uCount + 1; 
            echo "class $mname<br />"; 
        }
        if($mrace !== $check['race'])
        {
            mysql_query("UPDATE user SET race='$mrace' WHERE charactername='$mname'");
            $uCount = $uCount + 1; 
            echo "race $mname<br />"; 
        }
        if($mgender !== $check['gender'])
        {
            mysql_query("UPDATE user SET gender='$mgender' WHERE charactername='$mname'");
            $uCount = $uCount + 1; 
            echo "gender $mname<br />"; 
        }
        if($mrank !== $check['rank'])
        {
            mysql_query("UPDATE user SET rank='$mrank' WHERE charactername='$mname'");
            $uCount = $uCount + 1; 
            echo "rank $mname<br />"; 
        }
    $pCount = $pCount + 1;

    }   
    else
    {
    //add new user otherwise
        $sql="INSERT INTO user (charactername, class, race, level, gender, rank) VALUES ('$mname','$mclass','$mrace','$mlevel','$mgender','$mrank')";
        $nCount = $nCount + 1;
        if (!mysql_query($sql,$con))
            {
            die('Error: ' . mysql_error());
            }
    }
}
    echo "$nCount new members added.<br />";
    echo "$pCount member(s) already existed.<br />";
    echo "$uCount member(s) got updated <br />";

しかし、今が問題です。このコードを更新部分に使用すると、次のようになります。

if($mlevel !== $check['level'])
        {
            mysql_query("UPDATE user SET level='$mlevel' WHERE charactername='$mname'");
            $uCount = $uCount + 1; 
            echo "level $mname<br />"; 
        }

とにかく実行してください。理由がわかりません。データを比較しましたが、エコーすると両方が等しくなります。したがって、 !== を使用すると、私が知る限り、それらが同一でない場合にのみ発火するはずです。現在の状況では、更新スクリプトを 800 回実行しています。また、文字通りユーザー テーブル内のすべてのデータを 800 回更新します。私が知る限り、これは必要ではありません。

どんな助けでも大歓迎です。

4

2 に答える 2

2

if($mlevel != $check['level'])!== は、それらがまったく同じ値とデータ型であるかどうかをチェックし、両方を異なる方法で取得しているため、php がそれぞれに異なるデータ型を割り当てている可能性があるため、!= を試す必要があります。

または、 $a =(int)$mlevel と $b = (int)$check['level'] の両方を変換してから !== を実行できます

于 2012-08-02T04:03:26.610 に答える
0

これはおそらく最善の方法ではありませんが、@ MatthewBlancarteのおかげで、クエリがNullになったことがわかった後、コードを変更することにしました。

foreach($decode['members'] as $p) {
$mrank = $p['rank'];
$mname = $p['character']['name'];
$mclass = $p['character']['class'];
$mrace = $p['character']['race'];
$mlevel = $p['character']['level'];
$mgender = $p['character']['gender'];

$check = mysql_query("SELECT * FROM user WHERE charactername='$mname'");


while($row = mysql_fetch_array($check)){
    $prank = $row['rank'];
    $pname = $row['charactername'];
    $pclass = $row['class'];
    $prace = $row['race'];
    $plevel = $row['level'];
    $pgender = $row['gender'];
}

if($check == false)
{ 
    die("Sql query failed"); 
}

if(mysql_num_rows($check) != 0)
{   
    if($mlevel != $plevel)
    {
        mysql_query("UPDATE user SET level='$mlevel' WHERE charactername='$mname'");
        $uCount = $uCount + 1; 
        //echo "level $mname<br />"; 
    }

mysql_fetch_arrayを使用してwhileループにクエリを追加します。

while($row = mysql_fetch_array($check)){
    $prank = $row['rank'];
    $pname = $row['charactername'];
    $pclass = $row['class'];
    $prace = $row['race'];
    $plevel = $row['level'];
    $pgender = $row['gender'];

それを修正したのは、それらの変数と比較して機能することです。助けてくれてありがとう。そして、より多くの人々がイエスとコメントする前に..私はSQLインジェクションを修正します..>。>

于 2012-08-02T05:25:32.610 に答える