MySQL — PHP Преобразование объекта PDO в массив и эхо foreach

Я использую базу данных 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 указан неверный аргумент ()

Может ли кто-нибудь уделить мне минутку и объяснить, как мне поступить? Благодарю.

0

Решение

Я держу пари, что запрос не выполняется, а 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.

0

Другие решения

В вашем коде отсутствует инструкция извлечения all, поэтому запрос возвращает значение null / undefined.

использование

$data = $database->query("SELECT email FROM account")->fetchAll();

и читать документы

-1

По вопросам рекламы [email protected]