php sql查询占位符,使用命名占位符时PHP / SQL插入错误
我有以下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]:参数号无效:绑定变量数与令牌数不匹配
我犯了什么愚蠢的错误?
解决方法:
您的$userData必须具有与您的语句绑定的完全相同的占位符,不多也不少.请参阅PDOStatement::execute documentation,该部分显示“您无法绑定多于指定值的值”.
你需要准备你的参数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);
}
像这样的抽象的好处是你不需要担心绑定参数本身.
标签:php,arrays,mysql,pdo,associative-array
来源: https://codeday.me/bug/20190923/1814246.html
php sql查询占位符,使用命名占位符时PHP / SQL插入错误相关推荐
- sql查询分析器 只读_DRDS 只读实例来解决复杂 SQL 查询
转自: 复杂 SQL 查询跑不动?DRDS 只读实例来解决!segmentfault.com 背景 在实际业务生产环境中,业务应用系统在使用 OLTP 数据库将数据进行存储后,均会存在如后台运营类系 ...
- SQL高级语句-SQL 通配符-在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符。
SQL 通配符 在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符. SQL 通配符必须与 LIKE 运算符一起使用. 在 SQL 中,可使用以下通配符: 通配符 描述 % 替代一个或多个字 ...
- sql查询非ascii字符_SQL替换:如何在SQL Server中替换ASCII特殊字符
sql查询非ascii字符 One of the important steps in an ETL process involves the transformation of source dat ...
- python执行sql查询脚本并填写到excel_用Python执行SQL、Excel常见任务?10个方法全搞定!...
数据从业者有许多工具可用于分割数据.有些人使用 Excel,有些人使用SQL,有些人使用Python.对于某些任务,使用 Python 的优点是显而易见的.以更快的速度处理更大的数据集.使用基于 Py ...
- asp sql查询过滤空格_对比Excel,轻松学习SQL数据分析数据笔记02
本文主要梳理<对比Excel,轻松学习SQL数据分析>对于自己有用的sql知识.这本书中的所有代码和函数均适用于my sql 8.0版本. SQL的基本功能数据定义(DDL)--对数据库, ...
- sql 查询数据库索引重建_不良的数据库索引– SQL查询性能的杀手–建议
sql 查询数据库索引重建 previous article, we explained what clustered and nonclustered indexes were, and showe ...
- linux下sql查询的使用,sql-server – 如何在Linux上查看SQL Server中的执行计划
微软发布了一款名为 SQL Operations studio的新工具,它类似于SSMS,但可以在Windows,Linux,Macos上使用. 下面是它的样子截图 使用sqlopsstudio查看实 ...
- sql查询所有商品的信息_属于菜鸟的sql 干货(7)
简单的多表查询 对表的常规操作事例 注 注 注 意:在做每一题时思考如何将需求转化成sql语句,思考逻辑,思考怎样实现,建议手动操作服用,效果更佳.建议多找案例多练!多练!多练!多思考!,学会sql则 ...
- java sql查询空内容_返回null值而不是sql查询中的空集
比方说,有两个表: select * from users; +-------+------+ | login | type | +-------+------+ | test1 | A | | te ...
最新文章
- java函数式编程_Java 函数式编程和 lambda 表达式详解
- 搞不定 NodeJS 内存泄漏?先从了解垃圾回收开始
- tensorflow的一些函数
- IP釋放、清除、以及刷新DNS
- C++异常处理(一) - iStack
- 神奇的go语言(聊天室的开发)
- centos7.4下的KVM虚拟机安装使用
- hcia题库app有哪些?HCNA题库和考试内容一模一样吗?
- 学习日记:scipy库的版本差异
- 《考勤信息管理系统》数据库 课程设计
- python数据分析的常用方法_16种常用的数据分析方法汇总
- charles抓PC端的包
- 漫步数理统计三十一——依分布收敛
- catboost原理
- 360随身wifi3代linux驱动下载,360随身wifi3驱动
- 一键下载优美图库图片(附源码了哦)
- 又一大的技术站点域名被ClientHold了
- python numpy 图片 pad 参数详解
- CRM SaaS是什么?
- Python AutoCAD 注释
热门文章
- 使用日志审计查看MaxCompute执行过哪些操作
- 1亿人点赞的晚会,如何做技术沉淀?
- 黑科技揭秘:百种异常随机注入,专有云为何稳如泰山
- 亚信安全信舱(DS)取得联通天玑安全平台兼容性认证
- 支持OpenStack,红帽将开源进行到底
- 4K修复版《海上钢琴师》登陆全国院线,一文读懂背后的黑科技!
- spring 事务隔离级别和传播行为_Java工程师面试1000题146-Spring数据库事务传播属性和隔离级别...
- mysql5.5编译安装参数_mysql-5.5源码编译安装(附参数对照表)
- mysql Slave is not configured or failed to initialize properly. You must at least set --server-id
- 学之思开源考试系统 - 使用手册