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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux+守护进程+php,【转载】Linux 守护进程的编程方法

【转载】Linux 守护进程的编程方法原文见:http://www.linuxdevelop.org/tingxx/show.php?tablec&id3Linux 守护进程的编程方法作者: 北京工业大学 小胡守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发…

翻手算法php,PHP各种常见经典算法总结【排序、查找、翻转等】

本文实例讲述了php各种常见经典算法。分享给大家供大家参考,具体如下:冒泡排序算法public function test() {$arr array(43, 54, 62, 21, 66, 32, 78, 36, 76, 39);var_dump($arr);echo ;$arr $this->bubblesort($arr);var_dump($arr);}public func…

php文件上传详解,PHP文件上传实例详解!!!

这篇文章主要介绍了PHP文件上传实例代码,需要的朋友可以参考下首先来看下上传部分的表单代码:文件: 这里有几个要注意的地方,首先看这句,这里我们采用POST方法,个别浏览器还支持PUT方法,当然这需…

php上传商品信息并显示,第37课 thinkphp5添加商品基本信息及通过前置钩子上传商品主图 模型事件(勾子函数)...

[TOC]手册地址:before_insert(新增之前的操作)要实现的功能上传原图片,在新增数据之前生成三张缩略图片,然后再插入数据添加商品基本信息及通过后置钩子上传商品主图思路控制器里调用模型的save()方法保存数据模型里的用前置勾子beforeInsert()保存之前把上传原图片先成三张缩略…

java下标越界的三种处理方式,数组下标越界,该怎么解决

数组下标越界package import_csv;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.sql.Connect…

commvault备份mysql,备份MySQL数据库的4种方式

备份MySQL数据库的4种方式前言我们试着想一想, 在生产环境中什么最重要?如果我们服务器的硬件坏了可以维修或者换新, 软件问题可以修复或重新安装,但是如果数据没了呢?这可能是最恐怖的事情了吧, 我感觉在生产环境中应该没有什么比数据跟更为重要.那么我…

php $app-run(),Thinkphp 5.x 应用启动 App::run()

在上文加载完配置等一系列工作之后,进入App::run(),在run()方法中,首先通过自动加载机制拿到 Request 的一个实例接着 $config self::initCommon()初始化公共配置,先是 addNamespace 添加app当前所在的命名空间,然后 …

php react-native,React-Native+Mobx实现商城APP

这次给大家带来React-NativeMobx实现商城APP,React-NativeMobx实现商城APP的注意事项有哪些,下面就是实战案例,一起来看一下。最近一直在学习微信小程序,在学习过程中,看到了 wxapp-mall这个微信小程序的项目&#xff…

mysql 流程控制语句,mysql PL(procedure language)流程控制语句

在MySQL中,常见的过程式SQL语句可以用在存储体中。其中包括IF语句、CASE语句、LOOP语句、WHILE语句、ITERATE语句和LEAVE语句,它们可以进行流程控制。IF语句相当于Java中的if()...else if()...else...CASE语句相当于Java中的switch()...case A:...break;…

mysql 空闲几分钟速度变慢,MYSQL 运作一小段时间后,速度变得奇慢。而CPU基本空闲状态...

当前位置:我的异常网 MySQL MYSQL 运作一小段时间后,速度变得奇慢。而CPU基本MYSQL 运作一小段时间后,速度变得奇慢。而CPU基本空闲状态www.myexceptions.net 网友分享于:2015-08-26 浏览:11次MYSQL 运行一小段时间后&#xff…

matlab axis 用法,MATLAB中regionprops的用法

Matlab图像处理函数:regionprops这里给出在Matlab图像处理工具箱中非常重要的一个图像分析函数:regionprops。顾名思义:它的用途是get the properties of region,即用来度量图像区域属性的函数。语法STATS regionprops(L,propert…

emqx配置mysql认证,emqx使用mysql完成用户密码验证和ACL鉴权

emqx使用mysql完成用户密码验证和ACL鉴权emqx使用mysql完成用户密码验证和ACL鉴权摘要:前几篇博客介绍的是使用配置文件配置了ACL和客户端用户名密码配置实现生产环境下的安全登录和权限控制,各项配置比较繁琐,修改起来比较麻烦,下…

MATLAB课程表分配问题,求助matlab大神,学校的课程安排太骚了,我们压根就不用学matlab...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼上了MATLAB,可是对数学完全不感兴趣。老师弄了个作业,代码附件了。求大佬帮忙理解原理后简单做一个不一样的过程的程序。帮忙注释一下代码。(一开始忘记下载要币了。不好意思)两个.m文件,需要放一…

php时间转分钟前,PHP把时间转换成几分钟前几小时前几天前

现在很多网站将时间的显示都变得比较人性化,今天项目有一个也需要在对应的资讯后面显示为几分钟前、几小时前,接下来吾爱编程为大家分享一下PHP把时间转换成几分钟前、几小时前几天前的方法,有需要的小伙伴可以参考一下:1、项目需…

emlog_toolkit.php,emlog 4.0版本IIS6下伪静态划定规矩

emlog默许不能生成静态文件,不过彷佛有生成静态页面的相干插件,该插件博客吧先不研讨,本日博客簿要引见的是emlog 4.0版本在IIS6环境下的伪静态划定规矩,人人都晓得,经由过程伪静态能够让博客文章网址变得对搜索引擎越…

php如何封装数组,PHP数组转对象 对象转数组封装类

代码如下/*** 数组 转 对象** param array $arr 数组* return object*/function array_to_object($arr) {if (gettype($arr) ! array) {return;}foreach ($arr as $k > $v) {if (gettype($v) array || getType($v) object) {$arr[$k] (object)array_to_object($v);}}retu…

api.php phpcms,phpcms程序api怎么写接口

易站通,带你玩转PHPCMS建站程序,让你更快的熟悉该程序下面让我们来学习吧phpcms api怎么写接口?最近自己开发了一套crm系统,想着如果将来能卖出去,能不能再界面动态调用自己网站的推荐信息,算是一种广告吧&…

oracle修改窗口字体大小,jQuery之字体大小的设置方法

先获取字体大小,进行处理。再将修改的值保存。slice() 方法可从已有的数组中返回选定的元素。arrayObject.slice(start,end)。start 必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素&…

oracle 删除表 索引也会删除吗,Oracle 删除当前用户下所有的表、索引、序列

通过下面语句可以得到要删除Oracle的所有表、索引、序列... 的语句select drop table || table_name ||;||chr(13)||chr(10) from user_tables; --delete tablesselect drop view || view_name||;||chr(13)||chr(10) from user_views; --delete viewsselect drop sequence …

基于Java、Kafka、ElasticSearch的搜索框架的设计与实现

Jkes是一个基于Java、Kafka、ElasticSearch的搜索框架。Jkes提供了注解驱动的JPA风格的对象/文档映射,使用rest api用于文档搜索。项目主页:https://github.com/chaokunyang/jkes安装可以参考jkes-integration-test项目快速掌握jkes框架的使用方法。jkes…