Foreach не присваивает значение переменной после запроса mysql

Я пытаюсь создать функцию PHP, которая позволит мне преобразовать user_id в имя пользователя из моей базы данных MySQL (поскольку задание, над которым я работаю, требует, чтобы это было сделано много, поэтому я бы предпочел просто вызвать функцию, чтобы быстро сделай это, чтобы не повторяться)

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу присвоить значение, возвращаемое из моего запроса, переменной, которая вызывает ошибку неопределенной переменной.

Функция вызывается из другого скрипта .php, поэтому мне нужно вернуть значение. user_id передается как параметр при вызове функции.

Я уже пытался объявить переменную перед запросом и присвоить значение во время цикла foreach, но не могу получить значения для сохранения и возврата.

//Convert user_id to Username
function usernameConvert($userid)
{  
    //Connection to DB
    include '../dbconnect.php';

    $results = $pdo->prepare('SELECT username FROM users WHERE 
    user_id = "$userid"');
    $results -> execute();


    foreach ($results as $row)
    {
        $username = $row["username"];
    }

    //comes back undefined
    return $username;
}

Основная ошибка, которую я получаю, это неопределенная переменная.

Заранее спасибо.

что вы видите, когда вы print_r($results); перед циклом?

Zak 28.05.2019 22:56

Объект PDOStatement ([queryString] => SELECT username FROM users WHERE user_id = "$userid" )

Ross 28.05.2019 22:58
php.net/manual/en/pdostatement.fetchall.php
AbraCadaver 28.05.2019 23:04

Я предлагаю вам проверить значения, которые вы используете для параметра $userid. Похоже, что идентификатор не существует, поэтому $results пусты, а $username никогда не инициализируется, что вызывает ошибку

Hamman Samuel 28.05.2019 23:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
121
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете напрямую использовать переменные внутри строки с одинарными кавычками ':

$foo = 'bar';
echo "hello $foo"; // hello bar
echo 'hello $foo'; // hello $foo

Это приводит к тому, что ваш запрос ищет идентификатор пользователя, равный строке $suserid, поскольку нет возможного результата, ваш цикл foreach проходит 0 кругов, а $username никогда не определяется.


Но использование двойные кавычки" сделает ваш запрос уязвимы для SQL-инъекций. Вы уже используете подготовленный оператор, но неправильно.
Рабочее решение с именованными параметрами:

$results = $pdo->prepare('SELECT username FROM users WHERE user_id = :id');
$results->bindParam(':id', $userid, PDO::PARAM_INT);
$results->execute();

См. PDOStatement::bindParam().


Вы также забыли использовать fetch()(не fetchAll(), поскольку вы ищете имя пользователя на основе первичного ключа. Поскольку первичный ключ уникален, вы можете получить максимум 1 строку. Поэтому цикл не нужен):

$results->execute();

$username = $results->fetch();

return $username;

NIce .. Хороший улов

Zak 28.05.2019 22:59

Все это имеет такой смысл и отлично работает! Спасибо!

Ross 28.05.2019 23:14

Спасибо @Росс! Не стесняйтесь голосовать и принимать его, добро пожаловать в ТАК!

AymDev 28.05.2019 23:15

Отличная работа, объясняющая возможности подготовленного оператора PDO. Следует отметить, что вы можете вызывать execute([ 'id' => $userid ]) с массивом напрямую, чтобы упростить задачу. Связывание может помочь с приведением типов.

tadman 28.05.2019 23:26

Я часто напрямую использую execute([/* ... */]), так как мне это тоже удобно ;-)

AymDev 28.05.2019 23:29

Другие вопросы по теме