Я пытаюсь создать функцию 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;
}
Основная ошибка, которую я получаю, это неопределенная переменная.
Заранее спасибо.
Объект PDOStatement ([queryString] => SELECT username FROM users WHERE user_id = "$userid" )
Я предлагаю вам проверить значения, которые вы используете для параметра $userid
. Похоже, что идентификатор не существует, поэтому $results
пусты, а $username
никогда не инициализируется, что вызывает ошибку
Вы не можете напрямую использовать переменные внутри строки с одинарными кавычками '
:
$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 .. Хороший улов
Все это имеет такой смысл и отлично работает! Спасибо!
Спасибо @Росс! Не стесняйтесь голосовать и принимать его, добро пожаловать в ТАК!
Отличная работа, объясняющая возможности подготовленного оператора PDO. Следует отметить, что вы можете вызывать execute([ 'id' => $userid ])
с массивом напрямую, чтобы упростить задачу. Связывание может помочь с приведением типов.
Я часто напрямую использую execute([/* ... */])
, так как мне это тоже удобно ;-)
что вы видите, когда вы
print_r($results);
перед циклом?