【问题标题】:Multiple variables with COUNT(URL) query带有 COUNT(URL) 查询的多个变量
【发布时间】:2016-03-22 00:51:11
【问题描述】:

下面的查询只包含一个变量 ($MyURL) 时有效。但是当我添加 $MySection 时,我开始收到以下错误消息:

PDOStatement::bindParam() 期望参数 3 很长,字符串在...

我知道如何在获取数组的查询中添加多个值,但是这种查询让我感到困惑。我做错了什么?

$sql= "SELECT COUNT(URL) AS num FROM pox_topics 
WHERE URL = :MyURL AND Site = 'PX' AND Section = ':MySection' AND Live != 0";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':MyURL',$MyURL,':MySection',$MySection,PDO::PARAM_STR);
$stmt->execute();
$Total = $stmt->fetch();

编辑:

我已经尝试使用 PDO::PARAM_STR 在 $MyURL、$MySection 和它们两个之后进行以下查询...

$sql= "SELECT COUNT(URL) AS num FROM pox_topics 
WHERE URL = :MyURL AND Site = 'PX' AND Section = :MySection AND Live != 0";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':MyURL',$MyURL,PDO::PARAM_STR);
$stmt->bindParam(':MySection',$MySection);
$stmt->execute();
$Total = $stmt->fetch();

但我收到此错误消息:“参数编号无效:绑定变量的数量与标记的数量不匹配”

【问题讨论】:

  • 如果这是您的实际代码,pox_topics 之后没有空格,MySQL 被读取为FROM pox_topicsWHERE 而不是FROM pox_topics WHERE
  • 我查了原文,pox_topics和WHERE之间有一个空格。
  • RTM on it php.net/manual/en/pdostatement.bindparam.php你做错了,':MySection'周围不应该有引号
  • 这令人困惑;当我删除引号时,我会立即收到错误消息。如果没有 $MyURL 和 $MySection 周围的引号,它将无法工作。
  • 这不是我说的,我说删除in => AND Section = ':MySection'

标签: php mysql


【解决方案1】:

您在AND Section = ':MySection' 中的第二次绑定':MySection' 周围有引号,需要删除。

然后你在同一个bindParam 中使用你的两个绑定。它们需要在单独的语句中。

$sql= "SELECT COUNT(URL) AS num FROM pox_topics 
WHERE URL = :MyURL AND Site = 'PX' AND Section = :MySection AND Live != 0";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':MyURL',$MyURL);
$stmt->bindParam(':MySection',$MySection,PDO::PARAM_STR);
$stmt->execute();
$Total = $stmt->fetch();

旁注:不确定您要将PDO::PARAM_STR 用于哪一个。分别调整。

还要确保这些变量具有值。如果它们失败,错​​误报告会给你一些东西。

手册中的示例http://php.net/manual/en/pdostatement.bindparam.php

$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();

将error reporting 添加到文件顶部,这将有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Then the rest of your code

旁注:显示错误应该只在暂存阶段完成,而不是在生产阶段。

同样使用 PDO 的错误处理:

【讨论】:

  • 感谢您的帮助。我尝试了您的脚本,验证了我的两个变量都有值并且它们都在数据库中,但我仍然遇到错误。我编辑了我的帖子以说明我现在的位置。我一定是犯了一个简单的错误,所以我会继续玩它。
  • @DavidBlomstrom 不客气,大卫。如果您还没有使用 PDO 的 php.net/manual/en/pdo.error-handling.php,请查看错误报告和错误检查。
  • @DavidBlomstrom 您可以尝试的另一件事是bindValue,而不是bindParam。
  • @DavidBlomstrom 还想到的另一件事是您在查询中使用了AND。如果其中任何一个失败,那么这将导致某处失败。确保查询满足“所有”要求。尝试一次删除一个,直到您看到它失败。您可以使用OR,具体取决于您要查询的内容。另请记住,AND Site = 'PX' (PX) 也区分大小写。查询失败的原因可能有多种。使用var_dump(); 查看正在发生的事情。您正在使用 PDO 进行连接,对吧?
  • @DavidBlomstrom 太棒了大卫。究竟是什么?
猜你喜欢
  • 1970-01-01
  • 2017-08-06
  • 2010-12-18
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多