web-dev-qa-db-ja.com

プリペアドステートメント使用時の「プロパティアクセスはまだ許可されていません」という警告

AES_ENCRYPT()を使用してパスワードをエンコードしてログインシステムを作成しようとしています。しかし、これらのコードを実装しようとすると、xdebugからいくつかの警告があります:

_...
$key = 'd0gis=SUPER-cute';
$sql = "SELECT * FROM `users2` WHERE username = ? AND pwd = AES_ENCRYPT(?, ?)";
$stmt = $conn->stmt_init();
$stmt->prepare($sql);
$stmt->bind_param('sss', $username, $password, $key);
$stmt->execute();
$stmt->store_result();
...
_

デバッガーが8行目または$stmt->prepare($sql);に達すると、xdebugの6つの同じ警告テーブルに次のように表示されます。

(!)警告:main():8行目のD:\ xampp\htdocs\learnphp\include\authenticate_mysqli.inc.phpではプロパティアクセスはまだ許可されていません

_$stmt_のエラープロパティは空であり、実際の問題はありませんが、この警告メッセージが表示される原因を知りたいだけです。

この警告メッセージをグーグルで検索しましたが、解決策が見つかりませんでした。

  1. プリペアドステートメントを使用したUPDATEクエリ
  2. http://php.net/manual/en/mysqli-stmt.param-count.php
10
weeix

Mysql接続が確立されていない可能性があります。 mysqli::__construct()の後で、チェックする必要があります _mysqli::$connect_error_ 、これはいくつかのPHPバージョンで壊れていました:

Mysqli-> connect_errorプロパティは、PHPバージョン5.2.9および5.3.0の時点でのみ正しく機能します。以前のPHPとの互換性がある場合は、mysqli_connect_error()関数を使用してくださいバージョンが必要です。

mysqli::__construct() のドキュメントから接続ボイラープレートを参照してください。

_$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

/*
 * This is the "official" OO way to do it,
 * BUT $connect_error was broken until PHP 5.2.9 and 5.3.0.
 */
if ($mysqli->connect_error) {
    die('Connect Error (' . $mysqli->connect_errno . ') '
            . $mysqli->connect_error);
}

/*
 * Use this instead of $connect_error if you need to ensure
 * compatibility with PHP versions prior to 5.2.9 and 5.3.0.
 */
if (mysqli_connect_error()) {
    die('Connect Error (' . mysqli_connect_errno() . ') '
            . mysqli_connect_error());
}
_
3
Markus Malkusch

編集:以下で説明する問題がOPで説明する問題の原因であると思いますが、私の回答で説明する問題はまったく同じエラーメッセージを生成しないため、これが最良の回答であるかどうかはわかりません。

また、PHP docsコメントセクションからこれに気づきました:

ステートメントが適切に準備されていないか、まったく準備されていない場合、このパラメーター(およびおそらくmysqli_stmtの他のパラメーター)は、「プロパティアクセスはまだ許可されていません」というメッセージとともにエラーを発生させます。

これを防ぐには、これらのプロパティにアクセスする前に、「prepare」ステートメントの戻り値がtrueであることを常に確認してください。

元の回答:この警告は、特定のオブジェクト(クラスのインスタンス)を文字列として評価しようとしたときに発生します。

デバッガー/ IDEが変数の1つ($ stmt)を、おそらく監視リストまたは呼び出しスタックで評価しようとしていますが、文字列として評価することはできません。

もしあなたがそうするなら print_r変数では、PHPは文字列に変換できないため、同じエラーが発生します。

あなたの場合、PHPが文字列に変換できないのは$ stmtです。

このコードを7行目に配置すると、エラーが表示されます。

print_r($stmt);

やや補足:最近、この問題が発生したことはありません。最近、私はそれをたくさん手に入れています。なぜphpはアクセスできないプロパティをスキップして残りを印刷しないのですか?プロパティの範囲やゲッター/セッターの使用に関係していると思いますが、まだよくわかりません。その部分がわかったら更新します。

公式からPHPドキュメント:http://php.net/manual/en/ language.oop5.magic.php#object.tostring

__toString()メソッドを使用すると、クラスは、文字列のように扱われるときにどのように反応するかを決定できます。たとえば、$ objをエコーするもの。印刷します。このメソッドは文字列を返す必要があります。そうしないと、致命的なE_RECOVERABLE_ERRORレベルのエラーが発生します。

... PHP 5.2.0より前の__toString()メソッドは、echoまたはprintと直接組み合わされた場合にのみ呼び出されていたことに注意してください。PHP = 5.2.0、任意の文字列コンテキスト(例:%s修飾子付きのprintf())で呼び出されますが、他のタイプのコンテキスト(例:%d修飾子付き)では呼び出されません。PHP 5.2。 0、__ toString()メソッドのないオブジェクトを文字列に変換すると、E_RECOVERABLE_ERRORが発生します。

1
Evan de la Cruz