使用预准备声明时,“不允许属性访问”警告

时间:2013-09-16 15:32:12

标签: php mysql mysqli prepared-statement xdebug

我正在尝试使用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 \ includes \ authenticate_mysqli.inc.php中不允许属性访问

$stmt中的错误属性为空,我没有真正的问题,但我只是想知道导致此警告消息的原因。

用Google搜索此警告消息,但未找到任何解决方案:

  1. UPDATE query with prepared statements
  2. http://php.net/manual/en/mysqli-stmt.param-count.php

3 个答案:

答案 0 :(得分:3)

您的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());
}

答案 1 :(得分:1)

编辑:我认为我在下面描述的问题是OP描述的问题的原因,但是由于我在答案中描述的问题没有产生完全相同的错误信息,我不再确定这是最好的答案

另外,我从PHP文档评论部分注意到了这一点:

  

此参数(可能是mysqli_stmt中的任何其他参数)   将使用消息引发错误"不允许属性访问   然而"如果陈述没有准备好,或者没有准备好   所有

     

为了防止这种情况,请始终确保"准备"的返回值。   在访问这些属性之前,该语句为真。

原始答案: 当您尝试将某些对象(类的实例)评估为字符串时,会出现此警告。

您的调试器/ IDE正在尝试评估您的一个变量($ stmt),可能在监视列表或调用堆栈中,并且无法将其评估为字符串。

如果对变量执行print_r,则会得到相同的错误,因为PHP无法将其转换为字符串。

在你的情况下,PHP无法变成字符串的$ stmt。

将此代码放在第7行,您将看到错误:

print_r($stmt);

有些侧面说明:我最近才问过这个问题。我最近得到了很多东西。为什么php不跳过不可访问的属性并打印其余的?我相信它与属性的范围或使用getter / setter有关,但我还不太确定。当我想出那部分时,我会更新。

来自官方PHP文档的

http://php.net/manual/en/language.oop5.magic.php#object.tostring

  

__toString()方法允许类决定它的反应方式   当它被视为一个字符串。例如,echo $ obj;将   打印。此方法必须返回一个字符串,否则是致命的   发出E_RECOVERABLE_ERROR级错误......

     

...值得注意的是,在PHP 5.2.0之前的__toString()方法   仅在与echo或print直接组合时才被调用。   从PHP 5.2.0开始,它在任何字符串上下文中调用(例如在printf()中   使用%s修饰符)但不在其他类型的上下文中(例如使用%d   修正值)。从PHP 5.2.0开始,在没有__toString()的情况下转换对象   string的方法会导致E_RECOVERABLE_ERROR。

答案 2 :(得分:0)

在PhpStorm中运行测试时,我得到了还无法访问属性。我将项目的 PHP Lanugage Level 设置为7.2,并将 CLI Interpreter 设置为7.1。我将解释器更改为7.4,错误消失了。