У меня есть вопрос, связанный с php / pdo и sqlite. Я перенес некоторый код из бэкэнда mysql в бэкэнд sqlite. Я использовал rowCount () много в этом проекте.
В моем оригинальном приложении Mysql я сделал это:
$stmt = $db->query("SELECT id FROM table where id = $id ");
$rc = $stmt->rowCount();
if ($rc == 1) {
// do something
}
В документации сказано, что этот метод предназначен только для возврата затронутых строк из запросов UPDATE, INSERT, DELETE, с помощью драйвера PDO_MYSQL (и только этого драйвера) вы можете получить количество строк для запросов SELECT.
Итак, как добиться того же самого с помощью SQLite?
Вот как я это сделал:
$stmt = $db->query("SELECT count(id) as cnt FROM table where id = $id ");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
if ($row['cnt'] == "1") {
// do something
} else {
return false;
}
}
}
Я ищу более элегантное решение при достижении того же, что и rowCount ().
Это способ сделать это в pdo:
$stmt = $db->query('SELECT * FROM table');
if ($stmt->rowCount() == 1) {
//...
} else {
//...
}
echo $row_count.' rows selected';
(Так же, как XD)
Кстати, я бы не рекомендовал делать что-то вроде
$stmt = $db->query("SELECT count(id) as cnt FROM table where id = $id ");
Это не хорошо иметь переменные в таких утверждениях. использовать что-то вроде:
$stmt = $db->query('SELECT id FROM table where id = ?');
$stmt->execute(array($id));
if ($stmt->rowCount() == 1)
{
$arr = $stmt->fetch(PDO::FETCH_ASSOC);
foreach($arr as $element)
{
echo '<pre>'.print_r($element).'</pre>';
}
}
else
{
//...
}
Это часть кода, который я использую:
$stmt = $db->prepare('SELECT * FROM users WHERE id=?');
$stmt->execute(array($id));
if ($stmt->rowCount() == 1) {
$currentUser = $stmt->fetchAll(PDO::FETCH_ASSOC)[0];
} else {
return false;
}
Изменить: (для проблем совместимости)
$stmt = $db->query('SELECT * FROM table');
$arr = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (($arr === false) || (sizeof($arr) == 0)) {
return false;
} else {
//... do ....
echo sizeof($arr);
}
Других решений пока нет …