Я использую базу данных Medoo Framework. Следующий запрос возвращает объект PDO.
$datas=$database->query('
SELECT lethal_servers.LETHAL_ServerName AS "lethal_servers LETHAL_ServerName",
lethal_servers.LETHAL_ServerID AS "lethal_servers LETHAL_ServerID",
lethal_servers.LETHAL_ServerPort AS "lethal_servers LETHAL_ServerPort",
lethal_user.LETHAL_UserName AS "lethal_user LETHAL_UserName"FROM (
( lethal_servers AS lethal_servers
INNER JOIN lethal_server_user AS lethal_server_user
ON (lethal_server_user.LETHAL_ServerID = lethal_servers.LETHAL_ServerID )
)
INNER JOIN lethal_user AS lethal_user
ON (lethal_server_user.LETHAL_UserID = lethal_user.LETHAL_UserID )
)
WHERE (lethal_user.LETHAL_UserName = $lethal_UserName)
';
Использование следующего не работает, так как требует $datas
как массив.
foreach($datas as $data)
{
echo "servername:" . $data["LETHAL_ServerName"] . " port:" . $data["lethal_servers.LETHAL_ServerPort"] . "<br/>";
}
Я изо всех сил пытаюсь найти ответ где-нибудь в Интернете. Либо он использует устаревший mysql_*
функции или не соответствует моим потребностям.
С кодом выше он вернется:
Неопределенная переменная: данные
В foreach указан неверный аргумент ()
Может ли кто-нибудь уделить мне минутку и объяснить, как мне поступить? Благодарю.
Я держу пари, что запрос не выполняется, а PDO возвращается FALSE
,
Если мы не хотим проверять ошибки PDO, мы можем заставить PDO генерировать для нас исключение при возникновении ошибки, устанавливая атрибут:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
В противном случае вам нужно проверить $datas
, Если это ЛОЖЬ, то произошла ошибка. Если бы ваш код работал, он был бы уязвим для SQL-инъекций. Я не знаю, как вы можете работать с SQL таким образом, с ненужными паренями и огромными псевдонимами таблиц. Я предпочитаю использовать обратные метки, чтобы избежать идентификаторов. (Я считаю, что двойные кавычки будут работать, чтобы избежать идентификаторов, если sql_mode
включает в себя ANSI_QUOTES
.)
# enable PDO to throw an exception when an error occurs
$database->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
# use backticks rather than double quotes to escape identifiers
# use short table aliases to make the SQL easier to decipher
# eliminate unnecessary parens
# properly escape potentially unsafe values in SQL text
$datas=$database->query('
SELECT s.LETHAL_ServerName AS `lethal_servers LETHAL_ServerName`
, s.LETHAL_ServerID AS `lethal_servers LETHAL_ServerID`
, s.LETHAL_ServerPort AS `lethal_servers LETHAL_ServerPort`
, u.LETHAL_UserName AS `lethal_user LETHAL_UserName`
FROM lethal_servers s
JOIN lethal_server_user r ON r.LETHAL_ServerID = s.LETHAL_ServerID
JOIN lethal_user u ON u.LETHAL_UserID = r.LETHAL_UserID
WHERE u.LETHAL_UserName = ' . $database->quote( $lethal_UserName )
);
# if we haven't enabled PDO exceptions, then we need to check for errors
if(!$datas) {
# this isn't the best way to handle an error, but at least we handle it
echo "PDO query returned FALSE, so we know an error has occurred";
print_r($database->errorInfo());
exit(1);
}
Когда вы просматриваете набор результатов, имена столбцов будут такими, как указано в качестве псевдонима столбца.
Например, это неправильно:
$data[LETHAL_ServerName]
Потому что нет столбца с именем LETHAL_ServerName
возвращается по запросу.
Запрос назначил имя столбца какlethal_servers LETHAL_ServerName
«. (Неясно, почему вам нужно иметь столбец с таким длинным именем с пробелом в нем; я собираюсь предположить, что он как-то связан с платформой Medoo, и оставим имя столбца как есть. Мы необходимо сослаться на содержимое возвращаемого столбца со строкой, которая соответствует назначенному имени столбца, например
$data['lethal_servers LETHAL_ServerName']
ПРИМЕЧАНИЕ. У меня нет опыта работы с платформой Medoo. Так что я просто предполагаю, что $ database — это ссылка на объект соединения PDO.
В вашем коде отсутствует инструкция извлечения all, поэтому запрос возвращает значение null / undefined.
использование
$data = $database->query("SELECT email FROM account")->fetchAll();
и читать документы