最终代码:

 function pdo_array_query($pdo, $table_name, $data, $fields=array('*')){
//Will contain SQL snippets.
$rows_sql = array();
//Will contain the values that we need to bind.
$to_bind = array();
//Get a list of column names to use in the SQL statement.
$codition_array = array(); $codition_string = ""; foreach($data as $column_name => $column_value){
$codition_array[] = $column_name.' = :'.$column_name;
$param = ":" . $column_name;
$to_bind[$param] = $column_value;
}
$codition_string = implode(" and ", $codition_array);
$fields_string = implode(", ", $fields); $sql = "SELECT $fields_string FROM `$table_name` WHERE ".$codition_string; //Prepare our PDO statement.
$pdo_statement = $pdo->prepare($sql); foreach($to_bind as $param => $val){
$pdo_statement->bindValue($param, $val);
}
// return $pdo_statement->execute();
$pdo_statement->execute();
$result = $pdo_statement->fetchAll();
return $result;
//print_r($result);
}

用法:

    $pdo = get_mysql_connect(); // 自定义 获取pdo实例的方法
$table_name = 'order'; // 表名
$fields = array("idproduct", "email", "customer", "address");// 需要查询的字段
$data = array(
"idpayment"=>"1270117360-13027-963488",
"name"=>"John",
"age"=>"28",
"sex"=>"boy",
); // 查询的条件
pdo_array_query($pdo, $table_name, $data, $fields);

拼合后的 sql 如下:

SELECT idproduct, email, customer, address FROM `order` WHERE idpayment = :idpayment and name = :name and age = :age and sex = :sex

升级版:
       由于上面的方法,只能处理条件为 and 的情况,所以新方法增加了能添加 逻辑数组的 参数,具体代码如下:

 function pdo_array_query($pdo, $table_name, $data, $fields=array('*'), $operators=array('and')){
//Will contain SQL snippets.
$rows_sql = array();
//Will contain the values that we need to bind.
$to_bind = array();
//Get a list of column names to use in the SQL statement.
$condition_array = array();
$condition_string = ""; foreach($data as $column_name => $column_value){
$condition_array[] = $column_name.' = :'.$column_name;
$param = ":" . $column_name;
$to_bind[$param] = $column_value;
}
// $codition_string = implode(" and ", $codition_array);
if (count($operators) == 1 ) {
$condition_string = implode(' '.$operators[0].' ', $condition_array);
}
// the operators should less one than condition_array
else if (count($condition_array) - count($operators) == 1){
$result = cross_merge_array($condition_array, $operators);
$condition_string = implode(' ', $result);
} $fields_string = implode(", ", $fields); $sql = "SELECT $fields_string FROM `$table_name` WHERE ".$condition_string; echo $sql;
//Prepare our PDO statement.
$pdo_statement = $pdo->prepare($sql);
foreach($to_bind as $param => $val){
$pdo_statement->bindValue($param, $val);
}
$pdo_statement->execute();
$result = $pdo_statement->fetchAll();
print_r($result);
//return $pdo_statement->rowCount();
}

为了合理起见,关系数组 应该是要比 字段数组 少 1,如:

idpayment = :idpayment and name = :name or age = :age and sex = :sex
关系数组是: array('and', 'or', 'and') 长度为3
字段数组是: array('idpayment', 'name', 'age', 'sex') 长度为 4 数组交叉合并的方法: 也可参考 http://www.cnblogs.com/tommy-huang/p/9050161.html
  function cross_merge_array($arr1, $arr2)
{
$arr1 = array_values($arr1);
$arr2 = array_values($arr2);
$count = max(count($arr1), count($arr2));
$arr = array(); for ($i = 0; $i < $count; $i++) {
if ($i < count($arr1)) {
$arr[] = $arr1[$i];
} if ($i < count($arr2)) {
$arr[] = $arr2[$i];
}
}
return $arr;
}

用法:

    $pdo = get_mysql_connect(); // 自定义 获取pdo实例的方法
$table_name = 'order'; // 表名
$fields = array("idproduct", "email", "customer", "address");// 需要查询的字段
$data = array(
"idpayment"=>"1270117360-13027-963488",
"name"=>"John",
"age"=>"28",
"sex"=>"boy",
); // 查询的条件
$operators = array(
'and',
'or',
'and',
); pdo_array_query($pdo, $table_name, $data, $fields, $operators);

mysql使用pdo简单封装select语句的更多相关文章

  1. MySQL的C++简单封装

    /* *介绍:MySQL的简单封装,支持流操作输入输出MySQL语句,然而并没有什么软用,大二学生自娱自乐,有不足求指点 *作者:MrEO *日期:2016.3.26 */ 头文件 my_sql.h ...

  2. MySQL也有潜规则 – Select 语句不加 Order By 如何排序?

    今天遇到一个问题,有一个 Select 语句没有加 "Order By",返回的数据是不确定的. 这种问题碰到不止几次了.追根寻底, Select 语句如果不加 "Ord ...

  3. php web开发安全之sql注入和防范:(一)简单的select语句注入和防范

    sql注入主要是指通过在get.post请求参数中构造sql语句,以修改程序运行时所执行的sql语句,从而实现获取.修改信息甚至是删除数据的目的,sql被注入的原因主要是代码编写的有问题(有漏洞),只 ...

  4. mysql学习之完整的select语句

    本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order by limit 首发日期:2018-04-11 完整语法: 先给一下完整的语法,后面将逐一来 ...

  5. [ mysql优化一 ] explain解释select语句

    NOSQL  没有什么数据表, 只是一些变量,key_value  ,redis 支持的变量比较多.可以持久化文件到硬盘上. mysql 关系型数据库 ,表和表中间有各种id的关系. 缺点  高并发读 ...

  6. 原来select语句在MySQL中是这样执行的!看完又涨见识了!这回我要碾压面试官!

    大家好,我是冰河~~ MySQL作为互联网行业使用最多的关系型数据库之一,与其免费.开源的特性是密不可分的.然而,很多小伙伴工作了很多年,只知道使用MySQL进行CRUD操作,这也导致很多小伙伴工作多 ...

  7. mysql select语句解析

    select语句用于从一个或多个数据表选出特定行.特定列的交集 最简单的select语句的语法格式如下: select column1,column2 ........      (列) from 数 ...

  8. MySQL游标的简单实践

    Q:为什么要使用游标? A: 在存储过程(或函数)中,如果某条select语句返回的结果集中只有1行,可以使用select into语句(上几篇博客有介绍到用法)来得到该行进行处理:如果结果集中有多行 ...

  9. (3)一起来看下使用mybatis框架的select语句的源码执行流程吧

    本文是作者原创,版权归作者所有.若要转载,请注明出处.本文以简单的select语句为例,只贴我觉得比较重要的源码,其他不重要非关键的就不贴了 主流程和insert语句差不多,这里主要讲不同的流程,前面 ...

随机推荐

  1. MV人物抹去

    填充为背景 Music Video is one type of Video Processing.视频剪辑反向复原:视频图像分类:TensorFlow图像分类教程   改起个什么名字 视频分类数据集 ...

  2. 锁——Java同步的基本思想

    翻译人员: 铁锚 翻译时间: 2013年11月13日 原文链接:  Monitors – The Basic Idea of Java synchronization 如果你上过操作系统课程,你就知道 ...

  3. AngularJS 过滤器 Filter

    过滤器实质是数据转换或过滤,把ViewMode中的数据转化成View层用户友好的信息.可以看做一个函数,负责接收输入,转换成输出,每次参数变化时,它就被执行,输出被视图View使用. 一.基本定义及其 ...

  4. redis集群(主从配置)

    市面上太多kv的缓存,最常用的就属memcache了,但是memcache存在单点问题,不过小日本有复制版本,但是使用的人比较少,redis的出现让kv内存存储的想法成为现实.今天主要内容便是redi ...

  5. Python3.5 学习二十一

    本节内容概要: 上节回顾及补充知识点: 一.请求周期: URL->路由->函数或类->返回字符串或者模板 Form表单提交: 提交->url-函数或者类中的方法 -....(执 ...

  6. Ubuntu 16.04下安装golang

    手动安装 下载golang安装包 https://studygolang.com/dl 从上面的网站上下载适合自己机器的go版本,我这里选择的是go1.10.linux-386.tar.gz 解压安装 ...

  7. JAVA虚拟机体系结构JAVA虚拟机的生命周期

    一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.如果同一台计算机上同时运行三个Jav ...

  8. Swift 里 Set(二)概览

    类图  Set 是一个结构体,持有另一个结构体_Variant. 最终所有的元素存储在一个叫做__RawSetStorage的类里. 内存布局  结构体分配在栈上,和__RawSetStorage ...

  9. Java - Junit单元测试框架

    简介 Junit : http://junit.org/ JUnit是一个开放源代码的Java语言单元测试框架,用于编写和运行可重复的测试. 多数Java的开发环境都已经集成了JUnit作为单元测试的 ...

  10. Python code 提取UML

    Python是一门支持面向对象编程的语言,在大型软件项目中,我们往往会使用面向对象的特性去组织我们的代码,那有没有这样一种工具,可以帮助我们从已有代码中提取出UML图呢?答案是有的.以下,我们逐个介绍 ...