mysql_real_escape_string和PDO在mvc模式中没有连接

时间:2012-03-01 15:25:26

标签: php codeigniter pdo mysql-real-escape-string

我已经基于codeigniter框架样式创建了自己的mvc模式。我现在的问题是我想阻止SQL注入,为此我想使用mysql_real_escape_string()。但是当我使用它时,它会一直出错,因为它显然没有数据库的“链接/源”?

我收到了php错误:

  

警告:mysql_real_escape_string():无法连接到本地MySQL   服务器通过套接字'/var/lib/mysql/mysql.sock'(2)in   /hsphere/local/home/../dev/simple_blog/models/users_model.php在线   8

     

警告:mysql_real_escape_string():无法链接到服务器   建立在   /hsphere/local/home/../dev/simple_blog/models/users_model.php在线   8

我不太明白为什么,因为我可以把东西进出我的数据库,但由于某种原因我无法保护它?

这是我的函数给出错误

public function getUserByName($username){
    $username = mysql_real_escape_string($username);
    $sql = "SELECT * FROM ".$this->db_table." WHERE username='".$username."' LIMIT 1";
    $q = $this->db->query($sql);

    if($q->rowCount() > 0){
      foreach($q->fetch() as $key => $row){
        $data[$key] = $row;
      }
      return $data;
    }
  }

如您所见,我在顶部使用mysql_real_escape_string(),然后再使用查询内容。任何人都知道为什么这不起作用,如果是的话,我将如何解决它?

注意:我不是PDO的鲨鱼,$ this-> db是PDO类。

3 个答案:

答案 0 :(得分:2)

要使用mysql_real_escape_string,您需要首先使用MySQL函数连接到数据库服务器,这可能是您未完成的。

您正在混合两个完全不同的PHP扩展程序:mysqlPDO

此外,在使用PDO预处理语句时,您不需要转义字符串,这是通过PDO为您完成的。

使用PDO的一个例子:

$userDataStmt = $this->database->prepare('SELECT * FROM ' . $this->db_table . ' WHERE username = :username LIMIT 1');
$userDataStmt->bindValue(':username', $username);
$userDataStmt->execute();
if(!$userDataStmt->rowCount() <= 0)
{
    $result = $userDataStmt->fetchAll();
}

答案 1 :(得分:0)

不要这样做。如果您使用准备好的语句,PDO将为您逃脱:

$stmt = $this->db->prepare("SELECT * FROM ".$this->db_table." WHERE username=:user LIMIT 1";
$stmt->bind(':user', $username);
$stmt->execute();

PDO使用(我相信)幕后的mysqli库。 mysql_escape_real_string使用mysql库(注意i缺少)。这两个库都有完全独立的连接池,因此除非你建立一个带有mysql_connect()的丢弃链接,否则你无法使用mysql_real_escape_string,因为它需要一个活动的数据库连接。

答案 2 :(得分:0)

PDO版本为PDO::quote()。见http://php.net/manual/en/pdo.quote.php

所以在你的情况下,它将是

$username = $this->db->quote($username);

但是,大多数建议使用PDO预处理语句来避免PDO中的SQL注入。看到 http://php.net/manual/en/pdo.prepared-statements.php