Получение ошибки в PDO

Мой предыдущий вопрос был с использованием mysql_*, который устарел. Сейчас я учусь конвертировать mysql_* в 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');
 }
 });

4 ответа

Решение

Во-первых, вы делаете это неправильно, подготовка не работает, как mysqli_real_escape_string.. То, что вам нужно подготовить, это утверждение, которое в вашем случае должно выглядеть следующим образом

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

затем при выполнении необходимо связать параметры с предыдущим подготовленным оператором, чтобы он выглядел следующим образом

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

Итак, ваш окончательный код, который должен работать, будет выглядеть так

<?php
require_once 'db_connect.php';

$conn = dbConnect();
if (!empty($_POST['username'])) 
{
    $stmt = $conn->prepare("SELECT COUNT(id)
                                   FROM users
                                   WHERE username = :username");

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

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

?>

Хорошо, я в этом увлечении переписывания, только чтобы показать правильный путь

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";
    }
}

Всегда старайтесь избегать ненужного и ненужного кода.

Все объяснения для приведенного выше кода вы можете найти в теге вики: https://stackru.com/tags/pdo/info

Да... это супер неправильно.

$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.";
}

Внимательно прочитайте руководство по PHP, прежде чем использовать его. На нем много примеров и подробно объясняется, как его использовать.

В Руководстве сказано:

  • PDO:: query () выполняет оператор SQL в одном вызове функции, возвращая набор результатов (если таковой имеется), возвращенный оператором, как объект PDOStatement.

так что если вы используете query() чтобы получить свой результат, вам не нужно бежать prepare() а также execute()Просто сделайте это следующим образом:

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

Если вы выполните запрос несколько раз в приведенном ниже коде, вы можете использовать оператор prepare(что-то вроде скомпилированного кода):

  • Подготавливает инструкцию SQL для выполнения методом PDOStatement::execute().

и сделать это:

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

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

$result = $stmt->fetchColumn();

Не поймите неправильно эти два вида утверждений.

Другие вопросы по тегам