0

PHPでim newbを助けてください

これは13行目です

$data = mysql_fetch_assoc(mysql_query("SELECT $fields FROM `users` WHERE `user_id` = $user_id"));

これは私のコードです

<?php
function user_data($user_id) {
    $data = array();
    $user_id = (int)$user_id;

    $func_num_args = func_num_args();
    $func_get_args = func_get_args();

    if ($func_num_args > 1) {
        unset($func_get_args[0]);

        $fields = '`' . implode('`,`', $func_get_args) . '`';
        $data = mysql_fetch_assoc(mysql_query("SELECT $fields FROM `users` WHERE `user_id` = $user_id"));

        print_r($data);

        return $data;
    }
}

function logged_in() {
    return (isset($_SESSION['user_id'])) ? true : false;
}

function user_exists($username) {
    $username = sanitize($username);
    return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username'"), 0) == 1) ? true : false;
}

function user_active($username) {
    $username = sanitize($username);
    return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `active` = 1"), 0) == 1) ? true : false;
}

function user_id_from_username($username) {
    $username = sanitize($username);
    return mysql_result(mysql_query("SELECT `user_id` FROM `users` WHERE `username` = '$username'"), 0, 'user_id');
}

function login($username, $password) {
    $user_id = user_id_from_username($username);

    $username = sanitize($username);
    $password = md5($password);

    return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'"), 0) == 1) ? $user_id : false;
}   
?>

助けてくださいどうもありがとう

4

2 に答える 2

0

mysql_query()したがって、failsを使用したクエリFALSEは、リソースがmysql_fetch_assoc失敗する代わりに戻ります。

に渡す前に、必ず戻り値を確認してください。mysql_fetch_assoc()

$result = mysql_query("SELECT...");
if (!$result) {
    die('Invalid query: ' . mysql_error());
}

ちなみに、新しいコードにはmysql_*関数を使用しないでください。それらは非推奨ですPDOまたはMySQLiのいずれかで プリペアドステートメントを使用 します。これが良いPDOチュートリアルです。

于 2013-03-23T22:27:35.210 に答える
0

あなたのコード:

$data = mysql_fetch_assoc(mysql_query(.....

こんなことは絶対にしないでください。両方の DB 関数をそのようなコードの同じ行に配置し、一方がその結果を他方に直接渡すだけです。

このようにすることでmysql_query()、エラーが発生する可能性を完全に無視しています。

そして、それはまさにあなたの場合に起こっていることです。クエリの作成中に何らかのエラーが発生したため、mysql_query()が返されます。falseエラーをチェックしませんでしたが、その結果を に渡しただけmysql_fetch_assoc()です。falseそのため、その関数にはmysql の結果ではなく値が与えられ、それがエラー メッセージのすべてです。

これら 2 つの呼び出しを別のコード行に配置し、それらの間でエラー チェックを実行する必要があります

発生している実際のエラーはいくつかの原因で発生する可能性がありますが、発生しているエラーを破棄したためmysql_query、問題が何であるかを特定できません。そこに適切なエラーチェックを入れると、問題を解決するのに役立ちます。

ただし、いくつかの原因が考えられます。

  • 以外の追加引数なしで関数を呼び出しましたuserID。これにより$fields、空のバッククォート `` のペアだけが設定され、無効な SQL になります。
  • フィールドの 1 つで、フィールド名にバックティックが含まれています。これをチェックしていませんが、フィールド名にバッククォートがあると SQL コードが壊れます。これは危険であり、サイトのハッキングにつながる可能性があります。
  • DB 接続が無効であるか、壊れています。これは、コードの別の場所に問題がある可能性があります (その場合、他の場所にもより良いエラー チェックを追加する必要がある場合があります)、または完全にコードの外部にある可能性があります (つまり、DB 自体がダウンしている場合。可能性は低いですが、可能です。コードには必要なものがあります)。もしもの時に対応できるように)。

最後に、あなたは PHP の初心者であると述べているため、すべてのmysql_xxx()関数が非推奨であることをお伝えしておく必要があります。今後の使用はお勧めしません。

PHP の将来のバージョンから削除され、それらを使用するコードが機能しなくなるため、コードが多すぎて変更が難しくなる前に、今すぐ使用を中止することを強くお勧めします。

代わりに、PDOライブラリの使用を検討する必要があります。これは、古い関数では利用できない機能のスタック全体を備えた、PHP 用の最新の DB ライブラリですmysql_xxx()。詳細については、こちらとこちらをご覧ください。SO: Why should not I use mysql_* functions in PHP?のこの質問に対する回答も読む必要があります。

それが役立つことを願っています。

于 2013-03-23T22:52:26.810 に答える