-1

PHPファイルを実行すると、次のように出力されます。

エラー:結果を取得できませんでした、

理由はわかりませんが、他のファイルでこの正確なコードを使用したので、問題なく動作します。

コード:

<?php
$mysql = mysql_connect('localhost','root','password') or die('ERROR: Could not connect, ' . mysql_error($mysql));
mysql_select_db('twp',$mysql) or die('ERROR: Could not connect, ' . mysql_error($mysql));
$q = mysql_query("SELECT * FROM DenCrypt_Users",$mysql) or die('ERROR: Could not lookup users, ' . mysql_error($mysql));
if(!$q)
{
    die('ERROR: Could not lookup users, ' . mysql_error($mysql));
}
while($row[] = mysql_fetch_assoc($q))
{
    $lp[] = $row['lastPing'];
    $usr[] = $row['usr'];
    for($i = 0; $i < count($usr);$i++)
    {
        if($lp[$i] + 180 >= time())
        {
            $q = mysql_query("UPDATE DenCrypt_Users SET online='Offline' WHERE usr='$usr[$i]'") or die('ERROR: Failed to update user, ' . mysql_error($mysql));
        }
    }
}
?>

phpmyadminで同じクエリを実行しましたが、機能します。phpがデータをフェッチしないのはなぜですか?

4

2 に答える 2

9

結果セットの最後に、最終的にfalseを返すことが期待されます。 mysql_fetch_assoc()この不測の事態で死ぬのではなく、ループを終了するだけです。

while($row = mysql_fetch_assoc($q))
{
  // etc.

ただし、他の人が言及しているように、現在は非推奨になっているの使用を実際ext/mysqlに停止する必要があります。改善された MySQLi拡張機能への切り替えは、各関数呼び出しに文字を挿入するのとほぼ同じくらい簡単ですが、SQLインジェクション攻撃を軽減するために、プリペアドステートメントのパラメーター化iにも投資する必要があります。

于 2013-01-16T21:30:07.757 に答える
2

$rowwhileループの各反復で、配列に新しいアイテムを追加しているようです。

while($row[] = mysql_fetch_assoc($q) or die('ERROR: Could not fetch results, ' . mysql_error($mysql)))
{
    $lp[] = $row['lastPing'];
..
}

lastPing配列のインデックスを持つアイテムにアクセスできないようにする必要があると思います$row。フェッチされた行をそのような配列に収集するつもりですか?そうでない場合は、

while ( ($row = mysql_fetch_assoc($q)) !== false ) { .. }

の後に角かっこがないことに注意してください$row。(eggyalが述べたように死ぬ)

于 2013-01-16T21:37:49.807 に答える