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 连接对象的引用。