Как проверить наличие записей в таблице MySQL через PHP?

Я сейчас в процессе изучения PHP , поэтому практикую получаемые знания. Пишу модуль, который инициализирует базу данных (создает все таблицы) и администратора ресурса (записывает данные пользователя в таблицу). Предусмотрел в модуле условие, которое запрещает повторную инициализацию базы данных. Это условие выполняется с помощью вызова функции checkUser(), код которой представлен ниже.
function checkUser()
{
    global $connection;
    $checkUserQuery = 'SELECT * FROM users';
    if ($result = $connection->query($checkUserQuery)) {
        return true;
    } else {
        return false;
    }
}


Функция проверяет, есть ли уже в таблице 'users' запись о пользователе. Но функция дает ошибку: при вызове она всегда возвращает 'true', хотя никакой записи о пользователе в таблице еще нет. Из-за этого данные, переданные через форму, так и не попадают в базу данных. Может быть я неправильно проверяю результат выполнения запроса в функции?

P.S. Вот условие, в котором вызывается функция:
if (checkUser()) {
        echo <<<_CHECK_USER
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>Инициализация базы данных</title>
            <link rel="stylesheet" href="css/error.css"
        </head>
        <body>
            <div class="error-message">
                База данных уже была ранее инициализирована. Вы можете удалить файл инициализации базы данных.
            </div>
        </body>
        </html>
        _CHECK_USER;
}
  • Вопрос задан
  • 2915 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
if ($result = $connection->query($checkUserQuery)) {

Это очень распространенная ошибка.
И очень нелогичная.

Ты, когда запрашиваешь выписку в банке чтобы узнать, есть ли у тебя деньги, на что смотришь? Просто на то пришла ли выписка, или нет? Серьёзно? Или все-таки смотришь в саму выписку, какие там цифры?

query() возвращает результат запроса. Результат с нулем строк - это тоже результат. Сами строки ты получаешь другими функциями.

Чтобы узнать, еслть ли в таблице данные, нельзя запрашивать все строки. А представь что ты наконец освоишь программирование и на твоем сайте будет миллион пользователей. Будешь всех запрашивать в РНР чтобы узнать, есть ли хоть один?

Если надо узнать, есть ли в базе хоть один пользователь, надо и запрашивать одного. Л - логика.

function usersTableNotEmpty($connection)
{
    $checkUserQuery = 'SELECT 1 FROM users LIMIT 1';
    $result = $connection->query($checkUserQuery);
    $row = $result->fetch_row();
    return (bool) $row;
}


Кроме того, забудь про global. Привыкай всегда понимать, откуда и куда у тебя идут переменные, чтобы четко знать какая переменная у тебя что содержит и откуда взялась. А не просто с неба свалилась. Пеередавай переменные в функцию только через параметры
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
flapflapjack
@flapflapjack
на треть я прав
Функция проверяет, есть ли уже в таблице 'users' запись о пользователе.


Ваша функция не делает ничего вообще. В таблице users как минимум есть рут, и потому она всегда возвращает истину.

public function checkUser($user)
    {
        global $connection;
        $stmt=$connection>prepare("SELECT * FROM users WHERE user =:user");
        $result=$stmt->execute(array("user"=>$user));
        return $stmt->rowCount()>0 ? true : false;
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽