【问题标题】:PHP - PDO Invalid parameter numberPHP - PDO 参数号无效
【发布时间】:2014-12-29 12:38:11
【问题描述】:

关于这个有很多问题,但我仍然找不到能回答我问题的问题。

我得到了一些代码(显然),它对数据库进行查询,并且由于某种原因它返回了一个错误。

// ^ somewhere in the top session_start();
require("rw_conx.php");
try {
    // Get answers from database 
    $db = new PDO ("mysql:host=$host;dbname=$dbname", $username, $pass);
    $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $stmt = $db->prepare("SELECT antwoorden, commentaar
                        FROM antwoorden
                        WHERE vragenlijst = :vragenlijst
                        AND meting = :meting
                        AND behandeltraject = :behandeltraject
                        AND onderzoeksNR = :onderzoeksnummer");
    $vragenlijst = "1";
    $meting = "1";
    $onderzoeksNR = trim(preg_replace('#[^0-9]#', '', $_SESSION["onderzoeksnummer"]));
    $behandeltraject = trim(preg_replace('#[^0-9]#', '', $_SESSION["behandeltraject"]));        
    $stmt->execute(array('vragenlijst'=>$vragenlijst,'meting'=>$meting,'behandeltraject'=>$behandeltraject,'onderzoeksnummer'=>$onderzoeksNR));
    // Render all questions (check if 5's should be hidden), input disabled, no answer categories.          
    $num_rows = $stmt->rowCount();
    $row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT);

    // What this does is create a string like: 1=2,2=4,3=5|||COMMENTS|||1=blabla,2=blabla
    if ($num_rows > 0) {
        echo $row[0];
        echo "|||COMMENTS|||";
        echo $row[1];
    } else {
        echo "no data";
    }
} catch(PDOException $e) {
    echo "I'm sorry, I'm afraid I can't do that. (1)";
    file_put_contents('../debug.log', $e->getMessage(), FILE_APPEND);
    exit();
}   

$stmt->execute(array('vragenlijst'=>$vragenlijst,'meting'=>$meting,'behandeltraject'=>$behandeltraject,'onderzoeksnummer'=>$onderzoeksNR));

--- 编辑---

为了清楚起见,我会解释一下。

1.我在上面的问题中提到,会话没有问题。

我的意思是,发生的错误 (SQLSTATE[HY093]) 没有被抛出,因为会话是空的。

2。问题仍然存在。

即使 session_start() 修复了查询(它现在返回它应该返回的行),我仍然遇到同样的错误,这(当然)不应该发生。

我希望这能澄清一点,因为每个人都在生我的气。我确实提到了会话没有问题,并且对于发生的错误,它们没有问题。由于某种原因,即使查询成功运行,catch 函数仍然给我一个错误。

所以,如果还有人愿意帮助我,我将不胜感激。

--- 结束编辑 ---

有人看到(可能很明显的)缺陷吗?

【问题讨论】:

  • 检查表中的列名并确保类型正确。
  • 作为测试,您可以尝试在查询中使用? 而不是:name 作为您的参数,并在execute 调用中使用array($vragenlijst, $meting, ...) 吗?
  • 哦...等一下。你提到了会议。你开始会议了吗?包括session_start(); 吗?你在下面的评论中提到了一些关于var_dump($_SESSION);
  • @Fred-ii- LOL 事实证明你是对的,因为我是在向页面发送请求,而不是包含它......你真是个男人!我以为我包括了页面。非常感谢:P
  • @Fred-ii- 如果你愿意,你可以,你应得的 :)

标签: php mysql pdo


【解决方案1】:

您面临的问题是由于零宽度空间(​ in unicode)。这可能会自动添加到您正在使用的编辑器中。 jQuery 还将插入零宽度空格字符,您可以阅读 here。

但为什么它给我SQLSTATE[HY093] 错误?

这是因为$behandeltraject没有定义(前面有一个零宽的空格)所以参数不匹配。

【讨论】:

  • 干得好,伙计。我以前见过(unicode),但在 jQuery 脚本中会破坏 OP 的代码,但从来没有这样。我稍微修改了我的答案。
  • @Fred-ii- 是的,这是一个奇怪的问题。我猜 OP 从其他地方复制了代码(可能是荷兰语 PHP 课)。我很高兴我们一起解决了这个问题(会话 + 零宽度空间)。
  • 真是个奇怪的家伙。一段时间前,我第一次在 OP 的代码中听到一个 unicode 字符的风声,奇怪地把整个东西都粘贴了进去(记事本,然后是 MS Frontpage)。 Frontpage 将隐藏的字符显示为​,我开始用谷歌搜索它,发现它是什么。还有其他隐藏的角色进入了代码,至于他们是如何到达那里的,有时是个谜。在线使用或完成的编辑器类型(?)。我现在使用合适的 IDE,但我提到的那些仍然很好地为我服务(在一定程度上)。 干杯,很高兴这件事得到了解决; 终于。
【解决方案2】:

看到这个谜团GuyT 已解决,我根据a comment I left 在 OP 的问题下发布以下内容:

你提到了会议。你开始会议了吗?

是否包含session_start();?

您在另一个关于var_dump($_SESSION);的答案的评论中提到了

session_start(); 必须在所有使用会话的文件中。


原来的答案,在上面加了一个:

罢工>

您忘记了onderzoeksNR 中的$ 符号

'onderzoeksnummer'=> onderzoeksNR
                    ^ right there

关于

$onderzoeksNR = "1";

改成

'onderzoeksnummer'=>$onderzoeksNR

【讨论】:

  • 干得好,我确信它必须是显而易见的,但是这个?干杯!
  • @JiFus 是的,有时正是那些小事让我们更难找出失败的原因。我很高兴我们能够解决它 :) 干杯,非常欢迎您。
  • 正是我的猜测,首先但 OP 说“不,我检查过,它是正确的,会话没有问题”
  • @DanFromGermany OP 代码中的// Normally this are sessions... 从一开始就让我皱起眉头,我本来应该质疑它。这是一个棘手的问题。
  • @DanFromGermany 顺便说一句,那是你的 DV 吗?如果是,那就没必要了,别生气,你没有理由攻击我。你的答案不是解决方案。我赢得了我并提出了正确的问题。
【解决方案3】:

我的猜测是,错误来自不同的语句,或者其中一个值是使用会话变量的代码中的数组或 null

// Normally this are sessions, I checked them, and they contain a value.

您应该使用bindParam 成员,

$sth->bindParam(':calories', $calories, PDO::PARAM_INT);

...因为

  1. 它不会抛出奇怪的错误
  2. 使用execute(),所有参数都转换为string。

http://php.net/manual/en/pdostatement.execute.php

【讨论】:

  • 在您的链接 (php.net/manual/en/pdostatement.execute.php) 上显示以下内容:“您必须:调用 PDOStatement::bindParam() 来绑定 PHP 变量...”或“传递一个仅输入的数组参数值”那么为什么数组部分不起作用?
  • 我认为错误出在其他地方。对我来说,execute(array()) 风格的作品。我猜你的原始代码与上面的不同。
  • OP 应该接受你的,如果它会让你感觉更好的话。顺便说一句,这两种方法都适用于 PDO,所以你错了。
  • @Fred-ii- Dan 部分错误是正确的,但他的第一个想法是正确的。在我看来,这是一个糟糕的问题。当然,在 OP 写完 通常这是会话之后,我检查了它们,它们包含一个值。 最后值是空的。
猜你喜欢
  • 2018-12-01
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 2016-12-15
相关资源
最近更新 更多