Получение ошибки в 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" /> 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();
Не поймите неправильно эти два вида утверждений.