2013-12-09 63 views
0

我以前的问题是使用折旧的mysql_ *。我现在正在学习将mysql_ *转换为PDO,但在尝试运行文件时出现错误。错误是:在PDO中获取错误

<br /> <b>Catchable fatal error</b>: Object of class PDOStatement could not be converted to string in <b>C:\xampp\htdocs\username_check.php</b> on line <b>13</b><br /> 

现在我的PHP是这样的:

<?php 
require_once 'db_connect.php'; 

$conn = dbConnect(); 
    if (isset($_POST['username'])) 
{ 
    $username = $conn->prepare($_POST['username']); 

    if (!empty($username)) 
{ 
     $username_query = $conn->query("SELECT COUNT(id) 
             FROM users 
             WHERE username = '$username'"); 

//where am getting the error line 13 is above//        

        $username_query->execute(); 
     $num_rows = $username_query->fetchColumn(); 

     if($num_rows==0) 
     { 
      echo "Username doesn't exist"; 
      exit; 
     } 
     else 
     { 
      echo "Username already exists"; 
      exit; 
     } 
    } 
} 

?> 

我的连接PHP是这样的:

<?php 

function dbConnect(){ 
$db = null; 
$db_host = "localhost"; 
$db_username ="user"; 
$db_pass ="pass"; 
$db_name = "logins"; 

try{ 
$db = new PDO('mysql:host='.$db_host.';dbname'.$db_name,$db_username,$db_pass); 

} 
catch (PDOException $e) { 
    echo '<p>Cannot connect to database !!</p>'; 
    exit; 
} 
return $db; 
} 
?> 

我也是要告诉我的jQuery只是柜面的错误是在那里:

jQuery('#box1').keyup(function(){ 
var username = jQuery(this).val(); 

jQuery('#msg_out1').html('<img src="/click/ajax-loader.gif" width="43" height="11" /> &nbsp; Checking availability... '); 

if (username != '') { 
jQuery.post('/click/username_check.php', { username: username }, function(data){ 
    jQuery('#msg_out1').text(data); 

}); 
}else { 
jQuery('#msg_out1').html('Choose a Username.').css('color','grey').css('font-size','15px').css('margin-left','40px'); 
} 
}); 
+3

其中一个不会简单地执行'$ conn-> prepare($ _ POST ['username']);' – samayo

+3

为什么不搜索错误消息?你为什么不先从任何教程学习PDO,而只是把随机的PDO操作符放在一起呢? –

+0

我搜索的错误消息在这里显示的问题与我的问题没有关系,我用谷歌。我会这样做,谢谢你的积极反馈 – user3052886

回答

2

首先,你这样做是错误的方式,准备并不像mysqli_real_escape_string工作.. 你需要准备什么是你的情况应该是这样的

"SELECT COUNT(id) FROM users WHERE username = :username"

那么语句,执行的时候,你需要在参数绑定到以前准备好的声明,所以应该是这样的

$username_query->execute(array(":username" => $_POST['username'])); 

所以你的最终代码应该工作看起来像这样

+0

感谢您的解释,我使用的唯一原因是我准备的地方是mysql_escape_string。我也遇到了意想不到的错误“;”在行13的结尾。我删除了“;”并仍然有错误。我正在阅读PDO手册,但仍然没有看到任何东西 – user3052886

+0

我在$ stmt-> execute(array(“:username”=> $ _POST ['username']);'end'处添加了一个“)”工作 – user3052886

0

是啊......这是超级错误。

$username_query = "SELECT COUNT(id) FROM users WHERE username = ?"; 

if(! $sth = $conn->prepare($username_query)) { 
    // probably an error in your SQL syntax 
    die("Prepare error: " . var_export($conn->errorInfo(), true)); 
} 

if(! $sth->execute(array($_POST['username']) { 
    // probably a SQL integrity constraint violation [ie: duplicate key] or a server error 
    die("Execution error: " . var_export($sth->errorInfo(), true)); 
} 

if($sth->rowCount()) { 
    echo "Username exists."; 
} else { 
    echo "Username does not exist."; 
} 
+0

这是没有更好的,你知道 –

+0

@YourCommonSense它有什么问题吗? – Sammitch

+0

'die(“执行错误:'。网站用户将不知道你在向他展示什么 –

1

好吧,我在此改写热潮,只是为了显示以正确的方式

db_connect.php

<?php 
$db_host = "localhost"; 
$db_username ="user"; 
$db_pass ="pass"; 
$db_name = "logins"; 

$db = new PDO('mysql:host='.$db_host.';dbname'.$db_name,$db_username,$db_pass); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

主文件

<?php 
require_once 'db_connect.php'; 

if (isset($_POST['username'])) 
{ 
    $stmt = $db->prepare("SELECT 1 FROM users WHERE username = ?"); 
    $stmt->execute(array($_POST['username'])); 

    if($stmt->fetchColumn()) 
    { 
     echo "Username already exists"; 
    } 
    else 
    { 
     echo "Username doesn't exist"; 
    } 
} 

总是尽量避免无用的和不必要的代码。

所有explanationd上面的代码,你可以在标签维基发现:https://stackoverflow.com/tags/pdo/info

+0

+1例外 –

+0

谢谢你的回答和我将学习如何编写更好的更清洁的代码,我不是从使用newboston.org教程在家学习的学校学习,所以请和我一起袒护 – user3052886

+0

其他的事情,当我运行这段代码时,它说的语法错误意外{第11行 – user3052886

0

阅读使用前仔细PHP手册。有很多例子,并解释如何使用它的细节。

在手册它说:

  • PDO ::查询()执行一个函数调用SQL语句,返回结果集(如果有的话)退回该语句作为一个PDOStatement对象对象。

因此,如果您使用query()获取你的结果,你并不需要运行prepare()和​​,只是做如下:

$sql = 'select count(id) from test'; 
$return = $dbh->query ($sql); 
$result = $return->fetchColumn(); 

如果将在多次执行查询下面的代码,你可以使用一个准备声明(有点像编译的代码):

  • 准备要由PDOStatement :: execute()方法执行的SQL语句。

,并做到这一点:

$username = $_POST['username']; 
$sql = "SELECT COUNT(id) FROM users WHERE username = ?"; 

$stmt = $conn->prepare($sql); 
$stmt->bindParam(1,$username); 
$stmt->execute(); 

$result = $stmt->fetchColumn(); 

不要误会这两种语句。

+0

谢谢你的回答我正在阅读手册,以便更好地理解这些 – user3052886

+0

@ user3052886好。不要急于编码,先清楚它是什么。 – Snowwolf