需要帮助查找 PHP 错误的原因:无效的参数号:未定义参数

Posted

技术标签:

【中文标题】需要帮助查找 PHP 错误的原因:无效的参数号:未定义参数【英文标题】:Need help finding cause of PHP Error: Invalid parameter number: parameter was not defined 【发布时间】:2014-05-18 12:12:01 【问题描述】:

我无法找到此错误的原因。我知道这通常是由于执行()函数期间参数和值的数量不匹配引起的。但是,我已经使用 var_dump 和 echo 反复验证我的参数和值在此过程的每个阶段在数量上是否匹配。有人可以告诉我我的代码哪里错了吗?谢谢!

首先,这是我的初始代码:

$insert = array(
    array(  
      'fName' => 'Bob',   
      'mName' => 'C',  
      'lName' => 'Smith',  
      'suffix' => 'Jr'   
    ),  
    array(  
      'fName' => 'Tim',  
      'mName' => 'K',  
      'lName' => 'Jones',  
      'suffix' => 'Sr'  
    ),  
    array(  
      'fName' => 'Jim',  
      'mName' => 'P',  
      'lName' => 'Hampton',  
      'suffix' => 'III'  
    )  
);


$db = new Connect('clients');  
$db->insertMultiple($insert); 

然后,这是我的相关类函数:

public function insertMultiple($array)
   
        foreach($array as $inner)
        
            $fields = '(';
            $values = '(';

            foreach ($inner as $key => $value)
            

                $fields .= $key . ',';
                $values .= ':' . $value . ',';
            

            if (substr($fields, -1, 1) == ',')
            
                $fields = substr($fields, 0, -1);
            

            if (substr($values, -1, 1) == ',')
            
                $values = substr($values, 0, -1);
            

            $fields .= ')';
            $values .= ')';

            $sql = "INSERT INTO $this->name $fields VALUES $values";

            $this->query($sql);

            $this->bindValues($inner);

            try
            

                $this->execute();
            
            catch(PDOException $e)
            
                $date = new DateTime(); 

                file_put_contents($this->file, trim($this->error = $e->getMessage()). ' ' . $date->format('Y-m-d H:i:s') . php_EOL,FILE_APPEND);
                               
        

这个调用的函数是:

public function bindValues($array)
   
    foreach($array as $param => $value)
    
        $param = ':' . $param;

        $this->bind($param,$value); 
    


public function bind($param, $value, $type = null)

    if (is_null($type)) 
    
        switch (true) 
        
            case is_int($value):
                $type = PDO::PARAM_INT;
                break;
            case is_bool($value):
                $type = PDO::PARAM_BOOL;
                break;
            case is_null($value):
                $type = PDO::PARAM_NULL;
                break;
            default:
                $type = PDO::PARAM_STR;
        
    
    $this->stmt->bindValue($param, $value, $type);

我的查询方法:

public function query($query)

    $this->stmt = $this->dbh->prepare($query);

有人请指出我哪里出错了!谢谢!

【问题讨论】:

可以更新您的帖子以显示query() 方法吗? 添加了查询方法。谢谢! 您是否将error_reporting 设置为严格(-1)?如果出现拼写错误或未定义的变量,这可能会有所帮助。另外,您是否回显了您生成的$sql?看起来还可以吗? @Gregg,感谢您的意见。是的,当我回显它时,我的陈述看起来很完美,至于错误配置,我已将我的 $options 设置为:PDO::ATTR_PERSISTENT => false 和 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION。 但是我没有将它设置为严格(-1)。我会继续研究,但是我已经证实目前没有拼写错误或未定义的变量...... 【参考方案1】:

看起来你需要改变这个:

    foreach ($inner as $key => $value)
        

            $fields .= $key . ',';
            $values .= ':' . $value . ',';
        

到这里:

    foreach ($inner as $key => $value)
        

            $fields .= $key . ',';
            $values .= ':' . $key . ',';
        

该值实际上是一个占位符,通常与前缀为: 的键相同。如果我正确阅读了您的代码,那么您就是在实际值前面加上前缀。因此,您的绑定无法正常工作,因为它正在正确查找 :key,但您将占位符错误地定义为 :value

它会解释错误,因为它找不到您要查找的参数。

【讨论】:

就是这样!天哪,我不知道我怎么忽略了这一点。非常感谢。

以上是关于需要帮助查找 PHP 错误的原因:无效的参数号:未定义参数的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:未捕获PDOException:SQLSTATE [HY093]:参数号无效:无参数

SQL:无效的参数号:未定义参数

教义 setParameter 和无效参数号

将PHP PDO迁移到Laravel PDO会导致参数号无效

PHP PDOException:“SQLSTATE [HY093]:无效参数号”

在mysql中使用pdo的参数号无效问题