PHP 将 PDO 对象转换为数组并回显 foreach
PHP Converting a PDO Object into array and echo foreach
我正在使用 Medoo 数据库框架。以下查询 return 是一个 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_*
函数,要么不适合我的需要。
上面的代码会 return:
Undefined variable: datas
Invalid argument supplied for foreach()
谁能花点时间向我解释一下我将如何处理这件事?谢谢。
您的代码缺少 fetch all 语句,因此查询 returns null / undefined。
使用
$data = $database->query("SELECT email FROM account")->fetchAll();
并阅读 docs
我敢打赌查询失败了,PDO 正在返回 FALSE
。
如果我们不想检查PDO错误,我们可以让PDO在错误发生时为我们抛出异常,通过设置一个属性:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
否则,您需要测试$datas
。如果它为 FALSE,则说明发生了某种错误。如果您的代码可以正常工作,那么它很容易受到 SQL 注入攻击。我不知道你怎么能忍受这样使用 SQL,使用不必要的括号和巨大的 table 别名。我更喜欢使用反引号来转义标识符。 (我相信如果 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
”。 (目前尚不清楚为什么您需要使用带有 space 的长名称来命名列;我将假设它与 Medoo 框架有关,并保留列名. 我们需要使用与分配的列名称匹配的字符串来引用返回列的内容,例如
$data['lethal_servers LETHAL_ServerName']
注意:我对 Medoo 框架没有任何经验。所以我只是猜测 $database 是对 PDO 连接对象的引用。
我正在使用 Medoo 数据库框架。以下查询 return 是一个 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_*
函数,要么不适合我的需要。
上面的代码会 return:
Undefined variable: datas
Invalid argument supplied for foreach()
谁能花点时间向我解释一下我将如何处理这件事?谢谢。
您的代码缺少 fetch all 语句,因此查询 returns null / undefined。
使用
$data = $database->query("SELECT email FROM account")->fetchAll();
并阅读 docs
我敢打赌查询失败了,PDO 正在返回 FALSE
。
如果我们不想检查PDO错误,我们可以让PDO在错误发生时为我们抛出异常,通过设置一个属性:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
否则,您需要测试$datas
。如果它为 FALSE,则说明发生了某种错误。如果您的代码可以正常工作,那么它很容易受到 SQL 注入攻击。我不知道你怎么能忍受这样使用 SQL,使用不必要的括号和巨大的 table 别名。我更喜欢使用反引号来转义标识符。 (我相信如果 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
”。 (目前尚不清楚为什么您需要使用带有 space 的长名称来命名列;我将假设它与 Medoo 框架有关,并保留列名. 我们需要使用与分配的列名称匹配的字符串来引用返回列的内容,例如
$data['lethal_servers LETHAL_ServerName']
注意:我对 Medoo 框架没有任何经验。所以我只是猜测 $database 是对 PDO 连接对象的引用。