【问题标题】:Call to a member function real_escape_string() on a non-object在非对象上调用成员函数 real_escape_string()
【发布时间】:2011-06-20 23:52:30
【问题描述】:

我收到此错误:

调用成员函数 非对象上的 real_escape_string()

这里是$db

$db = new mysqli("127.0.0.1", "用户名", "密码", "sch5400");

在代码中:

function readSession($sessionId) {
    global $db;
    $sessionId = session_id();
    // escape session ID
    $sessionId = $db->real_escape_string($sessionId);
    $time = time();
    $result = $db->query("SELECT sessiondata FROM sessions WHERE sessionid='$sessionId' AND expiry > $time");
    if ($result->num_rows > 0) {
        $row = $result->fetchRow();
        return $row['sessiondata'];
    }
    // return empty string
    return "";
    }

它出现在第 5 行,相对于上面的代码。我不是实例化了$db吗?

【问题讨论】:

  • 是的。之前好像没有$db。
  • 我不是实例化了 $db 吗?不知道。你有吗?
  • @Shamil: php 持反对意见
  • @Shamil:现在你知道为什么global 不好了
  • @Shamil:创建一个返回$db函数。并像 $db = get_my_db(); 一样在每个需要 db 对象的函数中使用它

标签: php mysql


【解决方案1】:

可能更好的解决方案是创建一个单例函数:

function get_my_db()
{
    static $db;

    if (!$db) {
        $db = new mysqli("127.0.0.1", "username", "password", "sch5400");
    }

    return $db;
}

并像使用它

$db = get_my_db();

在每个需要数据库实例的函数中。

【讨论】:

  • 我不完全确定如何引用它来进行 real_escape_string 检查。
  • @Shamil:只需将global $db; 替换为$db = get_my_db(); 并照常使用它
  • @ZERKMS:感谢这个解决方案 - 我会向大家推荐它,因为我在 php 中使用会话处理程序时遇到了奇怪的问题。在我的 php 上 - 尽管我提供了用于存储 mysqli 连接的全局变量,但它在回调调用之间以某种方式消失了,保持一个连接和工作的唯一方法是将连接存储为本地静态,如上所示。谢谢。
【解决方案2】:

您还没有在显示的代码中的任何地方初始化$db,从错误来看,它听起来好像还没有在其他任何地方初始化(还)。

如果您正在初始化$db 某处,请确保它在之前 readSession 被调用。建立连接时还要检查错误消息。它在错误时返回false,这不是一个对象。

根据 PHP 手册,您应该使用以下错误检查方法之一来确保成功建立连接:

/*
 * 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());
}

【讨论】:

  • 我忘了补充说我在文件的前面有它......实际上就在它上面。
  • 嗯,实际上不是。他可能已经初始化,但已经重写它在别处
  • 好的,bemace 删除了我的 SQL 查询,但我假设你,它就在那里。我什至把它放在函数中。
  • @shamil 你能贴出创建数据库连接的代码吗?
【解决方案3】:

还有一个不需要数据库引用的全局函数。

$sessionId = mysql_real_escape_string($sessionId);

http://php.net/mysql_real_escape_string

【讨论】:

  • 为什么你认为 OP 有由mysql_connect 完成的有效 mysql 连接?顺便说一句,php 中的 所有 函数都是全局的。
  • 我将 $db->real_escape_string 与其他一些东西一起使用,它们很好:o
猜你喜欢
  • 1970-01-01
  • 2010-09-26
  • 2012-04-20
  • 2015-05-01
  • 2014-08-07
  • 2013-12-01
  • 2015-12-23
  • 2015-08-29
  • 2015-02-02
相关资源
最近更新 更多