-2

さて、私は今最も奇妙な問題を抱えています。私のコードは大丈夫です!MySQL を使用するたびに、解決策を見つけることができない無限の問題が発生するため、これは私にとって大きなショックです。

しかし、今日、すべてが完璧に機能しています。だから問題は何ですか?問題は、コードを関数でラップしようとすると、ただ... 動作しなくなることです! すべてのステップの後にエラーチェックがあり、独自のファイルと行にある場合は正常に機能します。ただし、パラメーターを追加できるように関数に入れる必要があり(したがって、「extraQuery」変数)、別のファイルからアクセスできるように「返す」必要があります。

ここに私の基本コードがあります:

$link = mysql_connect($db_host, $db_user, $db_pass) or die ("Unable to connect: " . mysql_error());
mysql_select_db($db_name, $link) or die("Couldn't connect to database: " . mysql_error());

$extraQuery = "";
$result = mysql_query("SELECT * FROM things " . $extraQuery . " ORDER BY RAND() LIMIT 1", $link);

$row = mysql_fetch_array($result, MYSQL_ASSOC);
mysql_close($link);
echo($row['content']);

私が言ったように、それはそのままで完全にうまく機能します。でも、こうすると……。

function getResult(){
    $link = mysql_connect($db_host, $db_user, $db_pass) or die ("Unable to connect: " . mysql_error());
    mysql_select_db($db_name, $link) or die("Couldn't connect to database: " . mysql_error());

    $extraQuery = "";
    $result = mysql_query("SELECT * FROM things " . $extraQuery . " ORDER BY RAND() LIMIT 1", $link);

    $row = mysql_fetch_array($result, MYSQL_ASSOC);
    mysql_close($link);
    echo($row['content']);
}
getResult();

..2行目で動作を停止し、「データベースが選択されていません」と表示されます。しかし、ご覧のとおり、存在するデータベースを明示的に選択しており、それ以外の場合は関数内にない場合に機能します。これを強調するために、それは私のユーザー権限ではなく、データベースの名前でもありません。関数の外では完全に機能するためです。

可能な限りの援助をいただければ幸いです。

4

4 に答える 4

3

変数のスコープにより、データベース変数は関数内では使用できません。getResult()アクセスするには、引数として渡す必要があります。

function getResult($db_host, $db_user, $db_pass, $db_name, $extraQuery){
    $link = mysql_connect($db_host, $db_user, $db_pass) or die ("Unable to connect: " . mysql_error());
    mysql_select_db($db_name, $link) or die("Couldn't connect to database: " . mysql_error());

    $extraQuery = "";
    $result = mysql_query("SELECT * FROM things " . $extraQuery . " ORDER BY RAND() LIMIT 1", $link);

    $row = mysql_fetch_array($result, MYSQL_ASSOC);
    mysql_close($link);
    echo($row['content']);
}
getResult();
于 2012-06-11T01:01:24.740 に答える
0

変数 $db_host,..., $db_name は、アクセスを隠したかったために存在するのでしょうか、それとも関数はここに書かれているとおりですか?

正確にこれらの変数をグローバルに宣言する必要がある場合があります (関数の最初の行: global $db_host,..., $db_name;)。そうしないと、関数内の値が初期化されません。

注: これを使用するのは良くありません。これを回避するようにコードを考えてください。推奨されるように、少なくとも MySQLi または PDO を使用してください。

于 2012-06-11T00:59:31.850 に答える
0

データベースにアクセスするための変数が関数のスコープにないようです。

次のようなことをする必要があります:

function getResult( $db_host, $db_user, $db_pass, $db_name)

次に、関数を次のように呼び出します。

getResult( $db_host, $db_user, $db_pass, $db_name);

globalまたは、次のように、これらすべての変数を変数として宣言します。

global $db_host, $db_user, $db_pass, $db_name;

これにより、それらが関数の範囲内にあることが確認されます。それ以外の場合、それらはすべて未定義です。

于 2012-06-11T01:00:04.033 に答える
0

$db_host、$db_name などをグローバルとして宣言するか、次のように関数に渡す必要があります。

function getResult($db_host, $db_user, $db_pass){
//
}

getResult('localhost', 'user', 'pass');
于 2012-06-11T01:01:25.780 に答える