1

私は自分のサイトを調べて、多くのものを共通の機能に変換して、より将来性のある、よりクリーンなものにしようとしています。

ユーザー セッション (セッション名はユーザー名) を取得する特定の関数があり、そのユーザーの他のすべてのデータを取得するデータベースに対してクエリを実行します。

一部でを使用したいのuserIDですが、「Notice: Undefined variable」というエラーが表示されます

これは例です:

function getUserData_FromSession() {
if (isset($_SESSION['user'])) {

    $username = "root"; 
    $password = "root"; 
    $host = "localhost"; 
    $dbname = "06vids";

    $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); 
    try 
    { 
    $db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options); 
    } 
    catch(PDOException $ex) 
    { 
    die("Failed to connect to the database: " . $ex->getMessage()); 
    } 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 

    $stmt = $db->prepare('SELECT * FROM users WHERE username = "' . $_SESSION['user']. '"');
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    while($row = $stmt->fetch()){
    $userid = $row['id'];
    $usernameuser = $row['username'];
    }

}
 }

その関数は、ページに含まれる関数ファイルにあり、そのページで次のようにします。

 getUserData_FromSession();

 if ($userid == $userbuildid) {
    $editenabled = 'edity';
} else if ($userid !== $userbuildid) {
    $editenabled = 'editx';
}

これにより、$userid が宣言されていないというエラーが発生します。実際に同じページにクエリがある場合は正常に機能しますが、どこにでも大量のクエリがポップアップすることは望ましくありません。

4

3 に答える 3

2

関数内で使用される変数は、外部では有効ではありません! 関数内にいる場合、どの名前が変数として既に使用されているかを覚えておく必要がないため、これは実際には良いことです。

関数は値を返します。その機能を使用したことはありませんが、使用する必要があります。

function whatever() {
    $variable = "bar"; // no effect outside this function!
    return "foo";
}

echo $variable; // Notice: undefined variable

$variable = whatever();
echo $variable; // outputs foo

$anythingelse = whatever();
echo $anythingelse; // outputs foo
于 2013-11-09T11:24:39.950 に答える
1

変数は関数のローカル スコープで定義されており、外部からアクセスすることはできません。もちろん、それをグローバルとして定義しない限り。

http://php.net/manual/en/language.variables.scope.php

したがって、簡単な修正は次のようになります。

function getUserData_FromSession() {
    global $userid;
    (...)
}
于 2013-11-09T11:26:02.757 に答える
1

変数が関数の$useridスコープ外に存在しません。関数の外で使用したい場合は、おそらく使用する必要がreturnあります。

function test() {
   $bar = 'stuff';  // references to local scope variable
}

echo $bar;

上記のコードもUndefined variableエラーを出力します。

$bar関数の外部で変数にアクセスできるようにする場合は、次のようにします。

function test() {
    $bar = 'stuff'; 
    return $bar;
}

$bar = test(); // $bar could be any other variable
echo $bar; // => stuff

変数名は重要ではないことに注意してください。つまり、$barin$bar = test();$foo$bazまたは$bakです。関数の戻り値を変数に代入しているだけなので、名前は関係ありません。

何らかの理由で上記のアプローチを使用できない場合は、次のように変数を として宣言できますglobal

function test() {
    global $bar;
    $bar = 'stuff'; 
}

test();
echo $bar; // => stuff

global一般にsを使用するのは悪い習慣だと考えられていますが、これで問題は解決します。

データベースのクエリに PDO を使用するのは良いことですが、さらに改善するには、パラメーター化されたクエリを使用できます。SQL インジェクションの防止に役立ちます。

于 2013-11-09T11:26:45.030 に答える