-1

私は次のコードを持っています:

function user_name($id) {
    $eqpt_name1 = $this->sql->query("SELECT `f_val` FROM `profiles` WHERE `u_id` = $id AND `f_id` = 1");
    $eqpt_name1_2 = $eqpt_name1->fetch();
    $name1 = $eqpt_name1_2['f_val'];

    $eqpt_name2 = $this->sql->query("SELECT `f_val` FROM `profiles` WHERE `u_id` = $id AND `f_id` = 2");
    $eqpt_name2_2 = $eqpt_name2->fetch();
    $name2 = $eqpt_name2_2['f_val'];

    $name3 = $name1 . " " . $name2;

    return $name3;
}

提供されたユーザーID($ id)を取得し、ユーザーのFirst($ name1)とLast($ name2)の名前を取得して、それを出力します。

私は次のようにしてそれを呼びます

$username = user_name($_SESSION['user_id']);

$_SESSION['user_id']1たとえば、です。

コードを手動でPHPファイルに入れると、正常に機能します。しかし、関数を使用してサイト全体でグローバルに使用できるため、すべてのページに長いクエリコードを設定する必要がない場合、Apacheで次のエラーが発生します。

PHPの致命的なエラー:非オブジェクトでのメンバー関数query()の呼び出し

これまでにクエリを含む関数を作成したことがなく、何が間違っているのかわかりません。

4

2 に答える 2

2

あなたがそれをどのように呼んでいるかから判断すると、それは単なるグローバル関数です。$thisは定義されないため、を使用することはできません$this->sql。と呼ばれるグローバル変数がある場合は、$sqlそれを使用していることをPHPに伝えます。

function user_name($id) {
    global $sql;

    $eqpt_name1 = $sql->query("SELECT `f_val` FROM `profiles` WHERE `u_id` = $id AND `f_id` = 1");
    $eqpt_name1_2 = $eqpt_name1->fetch();
    $name1 = $eqpt_name1_2['f_val'];

    $eqpt_name2 = $sql->query("SELECT `f_val` FROM `profiles` WHERE `u_id` = $id AND `f_id` = 2");
    $eqpt_name2_2 = $eqpt_name2->fetch();
    $name2 = $eqpt_name2_2['f_val'];

    $name3 = $name1 . " " . $name2;

    return $name3;
}

また、PDOを使用しているのに、プリペアドステートメントを使用しないのはなぜですか?また、物事をもう少し単純化することもできます。

function user_name($id) {
    global $sql;

    $query = $sql->prepare('SELECT `f_val` FROM `profiles` WHERE `u_id` = :id AND `f_id` IN (1, 2) ORDER BY `f_id`;');
    $query->execute(array(':id' => $id));

    return implode(' ', $query->fetchAll(PDO::FETCH_COLUMN));
}
于 2012-12-24T19:50:26.337 に答える
0

構成$this->は、「self」インスタンスの参照を示すためにオブジェクト内で使用する必要があります。

関数内に$thisはありません。おそらく、PDOクラスのインスタンスであるグローバル変数を使用しています。$thisにもかかわらず$GLOBALS['varname']を使用するか、関数内にPDOのローカルインスタンスを作成する必要があります。

function name()
{
    $pdo = new PDO( /* args */ ); // or use a global one 
    //$pdo = $GLOBALS['pdo'];
    $statement = $pdo->sql->query( "SELECT `f_val` FROM `profiles` WHERE `u_id` = ".$pdo->quote( $id )." AND `f_id` = 1" );
    $statement->execute();
    return $statement->fetchColumn(); // return first column
}

また、名前を連結するために2つのステートメントを実行していることにも注意してください。知識のためだけに、これらすべてを1つのSQLクエリに直接実行できます。

于 2012-12-24T20:11:37.100 に答える