Попытка выбрать строку данных с помощью MYSQL с помощью цикла foreach

#php #mysql

#php #mysql

Вопрос:

Я пытаюсь создать простую дружественную систему с PHP и MYSQL, и я не знаю, возможно ли вообще получить данные использования из другой таблицы, используя только их id. Кстати, я очень новичок, поэтому не очень хорошо знаю язык 🙂 Любая помощь была бы очень ценна

 <?php if(count($friend_request) > 0): ?>
    <?php foreach ($friend_request as $friend_request): ?>
        <?php
            try{
                $statement = $db->query("SELECT * FROM users WHERE id = '$friend_request['id']' ");
                $user_info = $statement->fetchAll(PDO::FETCH_ASSOC);

            }catch (PDOException $ex){
                $user_info = flashMessage("An error occurred: " .$ex->getMessage());
            }   

        ?>
        <?=$friend_request['id'] ?>
        <?=$friend_request['user_requested'] ?>
        <?=$friend_request['user_to'] ?>
        <?=$friend_request['request_date'] ?>
    <?php endforeach; ?>
<?php else: ?>
    <center>
        <input id="emailInput" type="text" name="requestEmail" placeholder="someonesemail@bruh.com">
    </center>
<?php endif; ?>
  

Комментарии:

1. Вы нигде не используете $user_info .

2. Также код выглядит подверженным SQL-инъекциям первого (прямого) или SQL-инъекциям второго порядка (хранимым).

3. если $friend_request это результат другого запроса, вам следует просто объединить два запроса вместо запроса внутри цикла.

4. да, я знаю, но я пытаюсь получить $friend_request[‘id’] в запросе mysql

5. Если между строками PHP нет HTML-кода, вам не нужно использовать <?php and ?> в каждой строке, если вам не нравится нечитаемый код

Ответ №1:

Вам нужно использовать фигурный синтаксис, если вы хотите поместить строку в кавычках в индекс переменной внутри строки.

 $statement = $db->query("SELECT * FROM users WHERE id = '{$friend_request['id']}' ");
  

Вы также можете исключить кавычки из индекса, но это не мое предпочтение.

Но было бы лучше использовать подготовленную инструкцию.

 <?php
if(count($friend_request) > 0):
    $statement = $db->prepare("SELECT * FROM users WHERE id = :id ");
    foreach ($friend_request as $friend_request):
        try{
            $statement->execute([':id' => $friend_request['id']]);
            $user_info = $statement->fetchAll(PDO::FETCH_ASSOC);
        }catch (PDOException $ex){
            $user_info = flashMessage("An error occurred: " .$ex->getMessage());
        }   
        ?>
        <?=$friend_request['id'] ?>
        <?=$friend_request['user_requested'] ?>
        <?=$friend_request['user_to'] ?>
        <?=$friend_request['request_date'] ?>
    <?php endforeach; ?>
<?php else: ?>
    <center>
        <input id="emailInput" type="text" name="requestEmail" placeholder="someonesemail@bruh.com">
    </center>
<?php endif; ?>
  

Комментарии:

1. Или $db->query("SELECT * FROM users WHERE id = '$friend_request[id]'");

2. Да, я пытаюсь игнорировать этот случай, я считаю это странной аномалией.

Ответ №2:

Я предполагаю, что ваш идентификатор числовой, передайте значение в новый var, например, $id = friend_request['id']; тогда ваш запрос может быть "SELECT * FROM users WHERE id = $id LIMIT 1" без » ‘», «ограничение 1» предназначено для производительности, а выборку, которую вам нужно использовать, просто извлеките больше информации здесь, чтобы получить только строку, $statement->fetch(PDO::FETCH_ASSOC); позже вы можете распечатать или использовать массив $ user_info для того, что вам нужно напрямую.

Комментарии:

1. Вот диграмма, которую я только что сделал, я надеюсь, это поможет с тем, что я пытаюсь сказать? imgur.com/QV0WU8D

2. это простое объединение, подобное SELECT a.username FROM users AS a LEFT JOIN friend_requests AS b ON b.user_id = a.id WHERE a.id = $id в части выбора вы можете получить любой нужный вам столбец с псевдонимами a или b и именем поля 🙂