PDO连接问题

时间:2013-01-01 17:20:51

标签: php mysql pdo

得到的代码如下:

<?php
require_once("../classes/pdo.class.php");
$db = new mysql();
$db->connect();
class votingpanel{

    public function logintopanel($username, $password){

        //Dane z logowania + token
        $login = mysql_real_escape_string($username); 
        $password = mysql_real_escape_string($password); 

            $sql = $db->prepare("SELECT * FROM xxx WHERE username = '$login'");
            $sql = $db->exec($sql);
            if($sql == 1){
                $password = sha1($password);
                $sql = $db->prepare("SELECT * FROM xxx WHERE username = '$login'");
                $sql = $db->exec($sql);
                $row = $sql->fetch();

                if($row['password'] == $password and $row['toplistadmin'] == 1){
                    $_SESSION['toplist_admin'] = 1;
                    $_SESSION['toplist_adminloged'] = 1;

                }
                else{
                    return false;
                }
            }
            else{
                return false;
            }


    }

}

?>

pdo类看起来像:

<?php

require_once("../konfiguracja.php");

class mysql{
    public function connect(){
        try {
            $conn = new PDO('mysql:host=xxx;dbname=xxx', 'xxx', 'xxx');
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch(PDOException $e) {
        echo 'ERROR: ' . $e->getMessage();
        }
    }
}
?>

作为回报,我得到了这样的错误:

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'radiolev'@'localhost' (using password: NO) in /home/radiolev/public_html/top/toplist.class.php on line 10

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/radiolev/public_html/top/toplist.class.php on line 10

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'radiolev'@'localhost' (using password: NO) in /home/radiolev/public_html/top/toplist.class.php on line 11

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/radiolev/public_html/top/toplist.class.php on line 11

Fatal error: Call to a member function prepare() on a non-object in /home/radiolev/public_html/top/toplist.class.php on line 13

我不明白为什么它出现导致mysql密码好。用普通的mysql_connect尝试了它们并且它工作但仍然不知道为什么它出现在pdo; s

3 个答案:

答案 0 :(得分:4)

你不应该尝试将mysql_real_escape_strings()与PDO一起使用 - 它不在PDO库中(它在旧的和讨厌的mysql库中)并使用不同的(全局 - blah)连接到D B。

首先使用mysql_real_escape_strings()删除2行。

其次,你正在使用准备好的陈述,所以BIND你的价值观 - 这很容易!只需使用以冒号开头的占位符替换变量,而无需手动引用它。然后调用bindValue()是新创建的PDOStatement(由$db->prepare()创建)的方法。最后在语句上调用execute。

              $sql = $db->prepare("SELECT * FROM xxx WHERE username = :login ");
              $sql->bindValue(":login", $login);
              $result = $sql->execute();

这将安全地逃脱并防止在mysql服务器端注入$ login变量。

答案 1 :(得分:1)

不要使用功能 - 您现在正在使用PDO,当您使用功能时,则在自动模式下使用默认设置创建连接。

你在你的类变量$ db中使用。但对于类方法,这是局部变量。您应该使用全局声明或将$ db作为函数的参数(通过引用)。

答案 2 :(得分:0)

此代码引发错误,因为您将mysql_*转义功能与PDO结合使用。 mysql_real_escape_string需要mysql_connect的活动数据库连接。 (不要问我为什么,但确实如此。)

如果您正在使用PDO的预处理语句,请不要打扰转义:只需使用内置参数传递:

// let $dbh be a PDO object, probably defined inside your mysql class
$stmt = $dbh->prepare("SELECT * FROM xxx WHERE username = ?");
$stmt->bindParam(1, $login);
$results = $stmt->execute();