我有以下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插入错误相关推荐

  1. sql查询分析器 只读_DRDS 只读实例来解决复杂 SQL 查询

    转自: 复杂 SQL 查询跑不动?DRDS 只读实例来解决!​segmentfault.com 背景 在实际业务生产环境中,业务应用系统在使用 OLTP 数据库将数据进行存储后,均会存在如后台运营类系 ...

  2. SQL高级语句-SQL 通配符-在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符。

    SQL 通配符 在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符. SQL 通配符必须与 LIKE 运算符一起使用. 在 SQL 中,可使用以下通配符: 通配符 描述 % 替代一个或多个字 ...

  3. sql查询非ascii字符_SQL替换:如何在SQL Server中替换ASCII特殊字符

    sql查询非ascii字符 One of the important steps in an ETL process involves the transformation of source dat ...

  4. python执行sql查询脚本并填写到excel_用Python执行SQL、Excel常见任务?10个方法全搞定!...

    数据从业者有许多工具可用于分割数据.有些人使用 Excel,有些人使用SQL,有些人使用Python.对于某些任务,使用 Python 的优点是显而易见的.以更快的速度处理更大的数据集.使用基于 Py ...

  5. asp sql查询过滤空格_对比Excel,轻松学习SQL数据分析数据笔记02

    本文主要梳理<对比Excel,轻松学习SQL数据分析>对于自己有用的sql知识.这本书中的所有代码和函数均适用于my sql 8.0版本. SQL的基本功能数据定义(DDL)--对数据库, ...

  6. sql 查询数据库索引重建_不良的数据库索引– SQL查询性能的杀手–建议

    sql 查询数据库索引重建 previous article, we explained what clustered and nonclustered indexes were, and showe ...

  7. linux下sql查询的使用,sql-server – 如何在Linux上查看SQL Server中的执行计划

    微软发布了一款名为 SQL Operations studio的新工具,它类似于SSMS,但可以在Windows,Linux,Macos上使用. 下面是它的样子截图 使用sqlopsstudio查看实 ...

  8. sql查询所有商品的信息_属于菜鸟的sql 干货(7)

    简单的多表查询 对表的常规操作事例 注 注 注 意:在做每一题时思考如何将需求转化成sql语句,思考逻辑,思考怎样实现,建议手动操作服用,效果更佳.建议多找案例多练!多练!多练!多思考!,学会sql则 ...

  9. java sql查询空内容_返回null值而不是sql查询中的空集

    比方说,有两个表: select * from users; +-------+------+ | login | type | +-------+------+ | test1 | A | | te ...

最新文章

  1. java函数式编程_Java 函数式编程和 lambda 表达式详解
  2. 搞不定 NodeJS 内存泄漏?先从了解垃圾回收开始
  3. tensorflow的一些函数
  4. IP釋放、清除、以及刷新DNS
  5. C++异常处理(一) - iStack
  6. 神奇的go语言(聊天室的开发)
  7. centos7.4下的KVM虚拟机安装使用
  8. hcia题库app有哪些?HCNA题库和考试内容一模一样吗?
  9. 学习日记:scipy库的版本差异
  10. 《考勤信息管理系统》数据库 课程设计
  11. python数据分析的常用方法_16种常用的数据分析方法汇总
  12. charles抓PC端的包
  13. 漫步数理统计三十一——依分布收敛
  14. catboost原理
  15. 360随身wifi3代linux驱动下载,360随身wifi3驱动
  16. 一键下载优美图库图片(附源码了哦)
  17. 又一大的技术站点域名被ClientHold了
  18. python numpy 图片 pad 参数详解
  19. CRM SaaS是什么?
  20. Python AutoCAD 注释

热门文章

  1. 使用日志审计查看MaxCompute执行过哪些操作
  2. 1亿人点赞的晚会,如何做技术沉淀?
  3. 黑科技揭秘:百种异常随机注入,专有云为何稳如泰山
  4. 亚信安全信舱(DS)取得联通天玑安全平台兼容性认证
  5. 支持OpenStack,红帽将开源进行到底
  6. 4K修复版《海上钢琴师》登陆全国院线,一文读懂背后的黑科技!
  7. spring 事务隔离级别和传播行为_Java工程师面试1000题146-Spring数据库事务传播属性和隔离级别...
  8. mysql5.5编译安装参数_mysql-5.5源码编译安装(附参数对照表)
  9. mysql Slave is not configured or failed to initialize properly. You must at least set --server-id
  10. 学之思开源考试系统 - 使用手册