0

我正在使用 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() 提供的参数无效

有人可以花点时间向我解释一下我会怎么做吗?谢谢。

4

2 回答 2

0

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

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

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

否则,您需要测试$datas. 如果它是 FALSE,那么就发生了一些错误。如果您的代码正常工作,它将容易受到 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 连接对象的引用。

于 2016-02-16T00:02:41.697 回答
-1

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

利用

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

并阅读文档

于 2016-02-15T23:08:37.673 回答