1

我正在尝试PDO连续执行两个单独的查询。但是,一次只能正确执行一个。无论哪个先出现,都是唯一正确查询数据库并返回任何值的。我尝试使用 var_dump 查看它们返回的内容,第二个 PDO 查询返回“boolean false”并且不包含任何信息。

这是我的代码:

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

// make and execute query for client information
    $client_query = $db->prepare('SELECT * FROM clients WHERE id=:ID');
    $client_query->execute(array('ID' => $client_id));
    $client_result = $client_query->fetch(PDO::FETCH_ASSOC);

    // set client information for captcha
    $this->client_name = $client_result['name'];
    $this->client_id = $client_result['id'];

    $client_query->closeCursor();

    // make and execute query for campaign information
    $campaign_query = $db->prepare('SELECT * FROM campaigns WHERE id=:ID AND client_id=:CLIENT');
    $campaign_query->execute(array('ID' => $campaign_id, 'CLIENT' => $client_id));
    $campaign_result = $campaign_query->fetch(PDO::FETCH_OBJ);

    // set campaign information for captcha
    $this->campaign = $campaign_result;

如果我从第二个查询中删除参数,它们都会成功执行。我在这里做错了什么?谢谢!

4

4 回答 4

3

您的 SQL 无效;改变这个:

SELECT * FROM campaigns WHERE id=:ID AND WHERE client_id=:CLIENT

对此:

SELECT * FROM campaigns WHERE id=:ID AND client_id=:CLIENT
于 2013-04-14T20:10:34.387 回答
2

正如错误和错误处理一章解释的那样:

PDO 为您提供 3 种不同的错误处理策略供您选择

...默认为PDO::ERRMODE_SILENT,这意味着:禁止所有错误消息,并希望开发人员不要忘记检查是否有错误。

总结一下:你需要做错误检查。

于 2013-04-14T20:23:45.700 回答
1

乍一看...我会将您的代码更改为:(在数组中也使用冒号,并且在第二个 sql 语句中存在 reseverd 关键字“where”的重复项)。我会异常而不是警告-然后在必要时捕获异常。

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

// make and execute query for client information
$client_query = $db->prepare('SELECT * FROM clients WHERE id=:ID');
$client_query->execute(array(':ID' => $client_id));
$client_result = $client_query->fetch(PDO::FETCH_ASSOC);

// set client information for captcha
$this->client_name = $client_result['name'];
$this->client_id = $client_result['id'];

$client_query->closeCursor();

// make and execute query for campaign information
$campaign_query = $db->prepare('SELECT * FROM campaigns WHERE id=:ID AND client_id=:CLIENT');
$campaign_query->execute(array(':ID' => $campaign_id, ':CLIENT' => $client_id));
$campaign_result = $campaign_query->fetch(PDO::FETCH_OBJ);

// set campaign information for captcha
$this->campaign = $campaign_result;

您可以在尝试检索值时执行上述操作,但请考虑使用 JOINS 代替,如下所示:

SELECT * FROM clients cls
LEFT JOIN campaigns cas ON (cls.id = cas.client_id)
WHERE cas.id=:ID
于 2013-04-14T20:23:49.400 回答
0

令人尴尬的是,所有代码都是正确的(除了你们中的一些人发现的一个小的 SQL 语法错误)。我的问题是 for 的值$campaign_id大于存储在 mySQL 表中的任何值,因此查询实际上没有返回任何结果。所以实际上查询没有问题,只是没有返回第二个结果。我感谢所有答案,并为这个可悲的疏忽道歉!

于 2013-04-14T22:34:13.933 回答