foreach не присваивает значение переменной после запроса MySQL - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь создать функцию 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;
}

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

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

1 Ответ

3 голосов
/ 28 мая 2019

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

$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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...