PHP将PDO对象转换为数组并回显foreach

时间:2016-02-15 22:42:44

标签: php mysql pdo medoo

我正在使用Medoo数据库框架。以下查询返回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()提供的参数无效

有人可以花一点时间向我解释我将如何解决这个问题?感谢。

2 个答案:

答案 0 :(得分:0)

我敢打赌,查询失败了,PDO正在返回FALSE

如果我们不想检查PDO错误,我们可以通过设置属性让PDO在发生错误时为我们抛出异常:

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

否则,您需要测试$datas。如果它为FALSE,那么就会发生一些错误。如果您的代码正常工作,那么它很容易受到SQL注入攻击。我不知道如何使用这样的SQL,使用不必要的parens和庞大的表别名。我更喜欢使用反引号来转义标识符。 (如果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的列。

查询将列名称指定为&#34; lethal_servers LETHAL_ServerName&#34;。 (目前尚不清楚为什么你需要使用带有空格的长名称命名的列;我将假设它与Medoo框架有关,并留下列名我们需要使用与指定列名匹配的字符串引用返回列的内容,例如

$data['lethal_servers LETHAL_ServerName']

注意:我没有使用Medoo框架的任何经验。所以我只是猜测$ database是对PDO连接对象的引用。

答案 1 :(得分:-1)

您的代码缺少fetch all语句,因此查询返回null / undefined。

使用

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

并阅读docs