1

PHPMySQLSelectに小さな問題があります。この関数はPHPクラス内にあります。これが私が得るエラーです:

警告:mysql_fetch_array()は、パラメーター1がリソースであると想定しています。整数は59行目のC:\ xampp \ htdocs \ include \ database.phpで指定されています警告:extract()は、パラメーター1が配列であり、nullがC:\xampp\で指定されていることを想定しています。 59行目のhtdocs\include \ database.php

この関数は、データベースを更新するだけで、サイトにアクセスしたブラウザとOSを表示します。この関数は、POSTを使用してJavascriptファイルから収集されたOSとブラウザーに関するデータを送信するAJAX呼び出しによって呼び出される別のファイルから呼び出されます。データベースにすでにIPアドレスのエントリがある場合にのみ失敗します。データベースにIPアドレスエントリがない場合は、IPアドレスエントリの作成に成功します。

これが私のコードです:

function addStat($browser, $os){
    $IE = 0; $Firefox = 0; $Safari = 0; $Opera = 0; $Chrome = 0; $otherb = 0;
    $Windows = 0; $Linux = 0; $Mac = 0; $Android = 0; $iOS = 0; $otheros = 0;
    $ql = 0; $totalVisits = 0;
    $ip = ip2long($_SERVER['REMOTE_ADDR']);
    $q1 = mysql_query("SELECT * FROM " . DB_STATS . " WHERE ip='$ip'", $this->connection);
    if (mysql_num_rows($q1)==0){
        $browser = mysql_real_escape_string($browser);
        $os = mysql_real_escape_string($os);
        switch($browser){
            case "Internet Explorer":
                $IE += 1;
            break;
            case "Firefox":
                $Firefox += 1;
            break;
            case "Safari":
                $Safari += 1;
            break;
            case "Opera":
                $Opera += 1;
            break;
            case "Chrome":
                $Chrome += 1;
            break;
            default:
                $otherb += 1;
            break;
        }
        switch($os){
            case "Windows":
                $Windows += 1;
            break;
            case "Mac OS X":
                $Mac += 1;
            break;
            case "Linux":
                $Linux += 1;
            break;
            case "Android":
                $Android += 1;
            break;
            case "iOS":
                $iOS += 1;
            break;
            default:
                $otheros += 1;
            break;
        }
        $q = $this->query("INSERT INTO " . DB_STATS . " VALUES (null, '$ip', '$Chrome', '$IE', '$Firefox', '$Opera', '$Safari', '$otherb', '$Windows', '$Mac', '$Linux', '$Android' , '$iOS' , '$otheros', 1)");
        if ($q == true){
           return(1);
        }
        else{
           return(0);
        }
    }
    else if (mysql_num_rows($q1)==1){
        extract(mysql_fetch_array($ql));
        switch($browser){
            case "Internet Explorer":
                $IE += 1;
            break;
            case "Firefox":
                $Firefox += 1;
            break;
            case "Safari":
                $Safari += 1;
            break;
            case "Opera":
                $Opera += 1;
            break;
            case "Chrome":
                $Chrome += 1;
            break;
            default:
                $otherb += 1;
            break;
        }
        switch($os){
            case "Windows":
                $Windows += 1;
            break;
            case "Mac OS X":
                $Mac += 1;
            break;
            case "Linux":
                $Linux += 1;
            break;
            case "Android":
                $Android += 1;
            break;
            case "iOS":
                $iOS += 1;
            break;
            default:
                $otheros += 1;
            break;
        }
        $totalVisits += 1;
        $q = $this->query("UPDATE " . DB_STATS . " set Chrome='$Chrome', IE='$IE', Firefox='$Firefox', Opera='$Opera', Safari='$Safari', otherb='$otherb', Windows='$Windows', Mac='$Mac', Linux='$Linux', Android='$Android' , iOS='$iOS' , otheros='$otheros', totalVisits='$totalVisits'");
        if ($q == true){
           return(1);
        }
        else{
           return(0);
        }
    }
    else{
        return(-1);
    }
}

すべてが理にかなっていて、誰かが助けてくれることを願っています。

4

1 に答える 1

3

私は今それを見ます-あなたが使用$qlするつもりであるときにあなたは(小文字のL)を使用し$q1ました。これを、非常に短い変数名または非常に類似した名前を使用することに対する教訓にしましょう。

// $ql was initialized to 0
$ql = 0; $totalVisits = 0;

// $q1 holds the result resource
extract(mysql_fetch_array($q1));

フェッチタイプとして2番目のパラメータも指定しない限りextract()、の出力を呼び出すことはお勧めできません。デフォルトでは、各列の数値インデックスと連想インデックスの両方を返します。mysql_fetch_array()MYSQL_ASSOC

extract(mysql_fetch_array($q1, MYSQL_ASSOC));
// Or better
extract(mysql_fetch_assoc($q1));

一般に、特にどの列が選択されているかを特定せずにextract()行った場合は、グローバル名前空間に多数の変数がダンプされるため、ほとんどの状況で使用しないことをお勧めします。SELECT *それらの配列を介してそれらにアクセスする方が良いです:

$row = mysql_fetch_assoc($q1);
echo $row['browser'];
于 2012-05-17T02:35:02.440 に答える