PDO/PHP - проверьте, существует ли строка
Я хочу иметь условие, чтобы строка не существовала вообще.
$stmt = $conn->prepare('SELECT * FROM table WHERE ID=?');
$stmt->bindParam(1, $_GET['id'], PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
Пробовал if (count($row) == 0)
и if($stmt->rowCount() < 0)
, но никто из них не работает.
Ответы
Ответ 1
Вы можете просто проверить возвращаемое значение напрямую.
$stmt = $conn->prepare('SELECT * FROM table WHERE ID=?');
$stmt->bindParam(1, $_GET['id'], PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if( ! $row)
{
die('nothing found');
}
/*
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); // Same here
if( ! $rows)
{
die('nothing found');
}
*/
Если вы спрашиваете о проверке без извлечения, просто попросите MySQL вернуть 1
(или использовать команду COUNT()
).
$sql = 'SELECT 1 from table WHERE id = ? LIMIT 1';
//$sql = 'SELECT COUNT(*) from table WHERE param = ?'; // for checking >1 records
$stmt = $conn->prepare($sql);
$stmt->bindParam(1, $_GET['id'], PDO::PARAM_INT);
$stmt->execute();
if($stmt->fetchColumn()) die('found');
Ответ 2
if($stmt->rowCount() == 0)
должен работать нормально, поскольку количество строк не может быть меньше нуля в любом случае вообще.
Из руководства:
Для большинства баз данных PDOStatement::rowCount()
не возвращает количество строк, на которые влияет оператор SELECT
. Вместо этого используйте PDO::query()
выдать инструкцию SELECT COUNT(*)
с тем же предикаты как ваш предполагаемый оператор SELECT
, затем используйте PDOStatement::fetchColumn()
, чтобы получить количество строк, которые будут возвращаться. Затем ваше приложение может выполнить правильное действие.
Я бы предложил прочитать здесь здесь.
Ответ 3
Вот что я использую в своих классах объектов:
function exists_by_id () {
// check if object exists by id
$stm = DB::$pdo->prepare('select count(*) from `table` where `column`=:column');
$stm->bindParam(':column', $this->column);
$stm->execute();
$res = $stm->fetchColumn();
if ($res > 0) {
return true;
}
else {
return false;
}
}