需要帮助查找 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]:参数号无效:无参数
将PHP PDO迁移到Laravel PDO会导致参数号无效