2014-10-03 121 views
1

我一直在努力,因为我努力学习如何pdo作品中,我一直在这一个文件到老mysqlpdo转换现在几个小时我的脑海里一片混乱,无法弄清楚什么是错误的,我确定它很多。警告:PDO ::准备()预计参数1是字符串,对象给出

try{ 
    $check_user_data = $dbh->query("SELECT * FROM members WHERE username = '$username'"); 
    $stmt = $dbh->prepare($check_user_data); 
    $stmt->execute(); 
    $result->bind_result($username); 
    $data_exists = ($check_user_data->fetchColumn() > 0) ? true : false; 
    if($data_exists = false){ 
     $final_report.="This username does not exist.."; 
    }else{ 
     $get_user_data = $stmt->fetch(PDO::FETCH_ASSOC); 
     if($get_user_data['password'] == $password){ 
      $start_idsess = $_SESSION['username'] = "".$get_user_data['username'].""; 
      $start_passsess = $_SESSION['password'] = "".$get_user_data['password'].""; 
      $final_report.="You are about to be logged in, please wait a few moments.. <meta http-equiv='Refresh' content='2; URL=members.php'/>"; 
     } 
    } 
    foreach ($dbh->query($sql) as $row){ 
    } 
    $dbh = null; 
} 
catch(PDOException $e){ 
    echo $e->getMessage(); 
} 

也越来越致命

Fatal error: Call to a member function execute() on a non-object 

不知道,如果致命的是关系到警告或不。

回答

2

首先,改变以下两行:

$check_user_data = $dbh->query("SELECT * FROM members WHERE username = '$username'"); 
$stmt = $dbh->prepare($check_user_data); 

到:

$stmt = $dbh->prepare("SELECT * FROM members WHERE username = :username"); 
$stmt->bindParam(':username', $username); 

这利用准备语句的参数特征,这防止SQL注入的。

接下来,PDO没有bind_result方法,这是MySQLI的一部分。为了获得满意的结果,你应该做的:

$get_user_data = $stmt->fetch(PDO::FETCH_ASSOC); 
$data_exists = ($get_user_data !== false); 

你应该再取出调用$stmt->fetchelse块,因为它会尝试得到结果的下一行。

+0

'SQLSTATE [42000]:语法错误或访问冲突:1065查询为空'其他所有工作都很好。我发布了一个新答案的变化。 – 2014-10-03 23:57:18

+0

这是否发生在$ dbh-> query($ sql)'行?你有没有分配'$ sql'? – Barmar 2014-10-03 23:58:23

+0

有没有在这里认为我需要它,所以我把它拿出来,不知道它为什么在那里。 'foreach($ dbh-> query($ sql)as $ row)',一切正常,感谢您的帮助。 – 2014-10-04 00:06:36

0

致命肯定与警告有关;您将$dbh->query()(这是PDOStatementObject)的结果传递到$dbh->prepare,导致$dbh->prepare返回不是对象的内容。

只需将SQL移入$dbh->prepare调用并完全摆脱$dbh->query()即可。

相关问题