我有以下PHP PDO语句:
$STH = $this->_db->prepare("INSERT INTO UserDetails (FirstName, LastName,
Address, City, County, PostCode, Phone, Mobile, Sex, DOB,
FundraisingAim, WeeksAim, LengthsAim, HearAboutID,
MotivationID, WelcomePackID, ContactPrefID, TitleID)
VALUES
(:firstName, :lastName, :address, :city, :county, :postCode,
:phone, :mobile, :sex, :DOB, :fundraisingAim, :weeksAim,
:lengthsAim, :hearAbout, :motivation,
:welcomePackPref, :contactPref, :title)");
$STH->execute($userData);
$userData
关联数组在哪里。我已经仔细检查了名称,但我不明白为什么会出现以下错误:
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
我犯了什么愚蠢的错误?
您$userData
的语句所绑定的占位符必须完全相同,且不能多于或少于。请参阅PDOStatement::execute
文档,其内容为“您不能绑定的值不能超过指定的值”。
您需要准备参数以execute()
完全匹配您的绑定。array_intersect_key()
如果正确安排阵列,这很容易。我通常将其包装在一个函数中,该函数还将处理前缀,如下所示:
// Adds a prefix to a name for a named bind placeholder
function prefix($name) {
return ':'.$name;
}
// like 'prefix()', but for array keys
function prefix_keys($assoc) {
// prefix STRING keys
// Numeric keys not included
$newassoc = array();
foreach ($assoc as $k=>$v) {
if (is_string($k)) {
$newassoc[prefix($k)] = $v;
}
}
return $newassoc;
}
// given a map of datakeyname=>columnname, and a table name, returns an
// sql insert string with named bind placeholder parameters.
function makeInsertStmt($tablename, $namemap) {
$binds = array_map('prefix', array_keys($namemap));
return 'INSERT INTO '.$tablename.' ('.implode(',',$namemap).') VALUES ('
.implode(',',$binds).')';
}
// returns an array formatted for an `execute()`
function makeBindData($data, $namemap) {
// $data assoc array, $namemap name->column mapping
return prefix_keys(array_intersect_key($data, $namemap));
}
// example to demonstrate how these pieces fit together
function RunTestInsert(PDO $pdo, $userData) {
$tablename = 'UserDetails';
// map "key in $userData" => "column name"
// do not include ':' prefix in $userData
$namemap = array(
'firstName' => "FirstName",
'lastName' => "LastName",
'address' => "Address",
'city' => "City",
'county' => "County",
'postCode' => "PostCode",
'phone' => "Phone",
'mobile' => "Mobile",
'sex' => "Sex",
'DOB' => "DOB",
'fundraisingAim' => "FundraisingAim",
'weeksAim' => "WeeksAim",
'lengthsAim' => "LengthsAim",
'hearAbout' => "HearAboutID",
'motivation' => "MotivationID",
'welcomePackPref' => "WelcomePackID",
'contactPref' => "ContactPrefID",
'title' => "TitleID",
);
$sql = makeInsertStmt($tablename, $namemap);
$binddata = makeBindData($userData, $namemap);
$pstmt = $pdo->prepare($sql);
$pstmt->execute($binddata);
}
这样的抽象的好处是您不必担心绑定参数本身。
我正试图使用Java中的一条准备好的语句在数据库中插入信息。我使用了占位符和设置字符串来避免SQL注入,但我一直有相同的错误:靠近“?”的Sytax不正确有人知道我做错了什么吗?这是我的代码: 我做了很多尝试,但都没有成功,连接到数据库的用户也有读写权限。 非常感谢你的回答!
问题内容: 在Python中,格式化字符串时,我可以按名称而不是按位置填充占位符,如下所示: 我想知道这在Java中是否可行(希望没有外部库)? 问题答案: 感谢你的帮助!利用您的所有线索,我编写了例程来完全实现我想要的功能-使用字典使用类似python的字符串格式。由于我是Java新手,因此不胜感激。
问题内容: 插入数据库时出现错误。 代码: 忽略dbquery,与mysql_query完全一样。 我收到的错误是: 不知道为什么会引发此错误! 问题答案: 教一个人如何钓鱼。 如果查询失败,那么您应该做的第一件事就是回显您要发送的查询: 通常,最终查询到底出了什么问题,这是很明显的。要特别注意查询中的动态内容,通常要注意MySQL抱怨的区域。 如果看起来还可以,那么您会寻找可能需要转义的单词
null 我是DocuSign的新手,请帮助我如何使用.NET实现第3步。
问题内容: 本质上,我有一个必须在SQL查询中多次调用的值。因此,是否可以在语句中重用相同的命名占位符,例如 ,然后简单地执行bindValue(“:Param”),并为两个:Params设置值? 问题答案: PDO ::prepare指出“您不能在准备好的语句中两次使用相同名称的命名参数标记”,所以我想那是不可以的。
那么有没有解决这个问题的方法,否则我如何使我的名字属性注入从我的yml属性? 谢谢