首页 > 解决方案 > 如何从我的 PDO 查询中提取一行?

问题描述

我在此代码的第 18 行遇到语法错误,这是包含变量 {$user} 的部分。

我想从查询中提取 3 个变量并将它们放入代码中的 PHP 变量中。

$user = 'xxxxx';
$password = 'xxxxx';
$db = 'xxxxx';
$host = 'xxxxx';
$conn = new PDO("mysql:host=$host; dbname=$db", $user, $password);
//$conn = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);


//7 day users
$query = "SELECT user,email_address,DATEDIFF(NOW(),OrderDate) AS DateDiff
FROM MyTable WHERE DATEDIFF(NOW(),OrderDate) >= 6 AND enabled = 1 AND products_id IN (377) AND user = 'xxxxx'";
$stmt = $conn->query($query);
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    extract($row);
        $to = "aa@ab.com";
        $subject = "expiries - ";
        $message = {$user};
        $from = "aa@ab.com";
        $headers = "From: $from";
        mail($to,$subject,$message,$headers);


        }

预期的结果应该是将用户从 SQL 查询中获取到一个名为 $message 的变量中

标签: phppdo

解决方案


一个while循环->fetch是多余的。Fetch以数组格式返回单行数据。因此,这里不需要 while 循环(因为循环的预期用途是循环数据)。

文档

PDOStatement::fetch — 从结果集中获取下一行

FETCH_ASSOC:
PDO::FETCH_ASSOC: 返回一个按列名索引的数组,如结果中返回的那样

此函数成功时的返回值取决于获取类型。在所有情况下,失败时返回 FALSE。

所以它返回一个数组。只需简单地使用:

try {
    $data = $stmt->fetch(PDO::FETCH_ASSOC);
    $column = $data['column'];
    # your code
} catch (Exception $e) {
    # err handling
}

根据评论编辑:

如果结果集有多行,你如何遍历它们?

您可以使用foreach循环使用->fetchAll()

PDOStatement::fetchAll — 返回一个包含所有结果集行的数组

# here we declare our SQL and pass in params for a prepared statement
$sql = 'SELECT * FROM table where `field` = :value;';
$res = $conn->prepare($sql);
$res->execute(array(':value' => $_POST['value'])); # exec the qry

# loop through the data and print_r $row
foreach ($res->fetchAll(PDO::FETCH_ASSOC) as $row)
{
    echo '<pre>'. print_r($row, 1) .'</pre>';
}

推荐阅读