Php 警告:mysql\u real\u escape\u string()[function.mysql real escape string]:用户访问被拒绝

Php 警告:mysql\u real\u escape\u string()[function.mysql real escape string]:用户访问被拒绝,php,mysql,connection,pdo,database-connection,Php,Mysql,Connection,Pdo,Database Connection,从提交的Html表单 <?php //////////////////////////////////////////////////////////////////////////////////// ###### Require Database ###### //////////////////////// require_once('src/cfg/dbi.php'); //////////////////////////

从提交的Html表单

<?php
////////////////////////////////////////////////////////////////////////////////////
###### Require Database ######                              ////////////////////////
require_once('src/cfg/dbi.php');

////////////////////////////////////////////////////////////////////////////////////
###### Call Session Functions Include ######                ////////////////////////            
require_once('src/cfg/sess_function.php');                  ////////////////////////
###### Call function as contained in sess_function() ######                       //
session_set_save_handler('_open','_close','_read','_write','_destroy','_clean');  //                            
###### Start session ###### ////////////////////////////////////////////////////////
session_start(); ///////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////



#fullname, email, password
    // Verify input was even provided
if (isset($_POST['fullname']) && isset($_POST['email']) && isset($_POST['password'])) {
    // Clean Input
    $userName = mysql_real_escape_string($_POST['fullname']); 
    $userEmailAddress = mysql_real_escape_string($_POST['email']); 
    $userPassword = mysql_real_escape_string($_POST['password']);

    # hash cleaned pass...
    $dynamSalt = mt_rand(20,9999); 
    $userPassword = hash('sha512',$dynamSalt.$userPassword);

    # connect database, then prepare, and finally perform query…
    #require_once('src/cfg/dbi.php');
    try{
        $dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
        $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
        // INSERT CLEAN DATA INTO TABLE…
        $sth = $dbh->prepare("
        INSERT INTO Fan(fanNm,fanEmail,fanPass,fanDynamSalt)
        VALUES('$userName','$userEmailAddress','$userPassword','$dynamSalt')"
        );
        $sth->execute();
        ////////////////////////////////////////////////////////////////////
        ## Set Session Var for this PK ID in Fan table that is being created ##
        ////////////////////////////////////////////////////////////////////
        $_SESSION['newUserSessID'] = $dbh->lastInsertId();

    } //try

    catch(PDOException $e){
            #echo "Oops, We're experiencing an error.INSERTING NEW FAN";
            file_put_contents('/PDODBConnectionErrors.txt', $e->getMessage(), FILE_APPEND);  
    } //catch

}
else{
    // Redirect back to login form
    header('../index.php');
    //*SHOW ERRORS*// 

}   

有人知道我做错了什么吗??它在本地机器上工作得很好。。但一旦我把它放到网上,它就会给我这些错误。在服务器上,我有
PHP版本5.2.17,localhost是5.3.1

您遇到了错误,因为您试图使用
mysql\u real\u escape\u string
而没有数据库的活动
ext/mysql
连接资源。这是因为您正在使用PDO,因此您只建立了PDO连接。这两个函数族不能互换

错误

$id = mysql_real_escape_string($id);
$sth = $dbh->prepare("SELECT data FROM sessions WHERE id = '$id'");
$sth->execute();
正确

$sth = $dbh->prepare("SELECT data FROM sessions WHERE id = ?");
$sth->execute(array($id));
也可以使用命名占位符:

$sth = $dbh->prepare("SELECT data FROM sessions WHERE id = :id");
$sth->execute(array(':id' => $id));

对于准备好的语句,查询中的参数在实现中进行内部转义,这是使用它们的最大好处之一。如果出于某种原因您确实需要手动转义查询的字符串部分,那么您需要使用PDO转义函数

当您使用数据访问抽象层(如PDO)时,您不应该使用mysql\u real\u escape\u string

您可能会在prod上遇到错误,因为您可能在那里设置了另一个显示错误


会话警告应通过移动会话_start()来解决;在文件的顶部,您可以在其中使用它。

检查您的MySQL身份验证。在文件的顶部,对不起:)还应该注意,虽然我只调用了一个混合两个扩展名的实例,但在几个地方有它。同样的答案也适用于使用PDO查询的任何地方。因此,将
WHERE中的字段从id='$id'
更改为
id=?
是合法的,当然,我使用的其他字段WHERE on?任何数据字段都可以成为占位符。元数据(表名、字段别名等)不能以这种方式替换。是的,这就是使用准备好的语句的方式。。。就像我说的,这是最大的优势之一。但正如Ignacio所说,它只在数据字段上起作用如何区分
id=?
(where?is id)和where
id=“$new\u sess\u id”
id=?”那样编写
$id = mysql_real_escape_string($id);
$sth = $dbh->prepare("SELECT data FROM sessions WHERE id = '$id'");
$sth->execute();
$sth = $dbh->prepare("SELECT data FROM sessions WHERE id = ?");
$sth->execute(array($id));
$sth = $dbh->prepare("SELECT data FROM sessions WHERE id = :id");
$sth->execute(array(':id' => $id));