12

我正在尝试通过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 行或第 8 行时,来自xdebug$stmt->prepare($sql);的 6 个相同警告表会显示:

(!) 警告:main(): 在第 8 行的 D:\xampp\htdocs\learnphp\includes\authenticate_mysqli.inc.php 中还不允许进行属性访问

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

谷歌搜索了这条警告信息,但没有找到任何解决方案:

  1. 使用准备好的语句更新查询
  2. http://php.net/manual/en/mysqli-stmt.param-count.php
4

3 回答 3

2

您的 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());
}
于 2014-01-12T11:49:35.190 回答
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() 方法的对象转换为字符串会导致 E_RECOVERABLE_ERROR。

于 2015-11-04T19:00:55.103 回答
0

在 PhpStorm 中运行测试时,我还不允许访问属性。我将项目的PHP 语言级别设置为 7.2,并将CLI 解释器设置为 7.1。我将解释器更改为 7.4,错误消失了。

于 2020-04-26T17:19:04.077 回答