最终代码:

 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. Alpha阶段敏捷冲刺(六)

    1.站立式会议 提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 祁泽文:查找了单词统计的方法. 徐璐琳:通过" ...

  2. Eclipse workspace 被占用问题

    eclipse 使用一段时间后,有时会因为一些故障自己就莫名奇妙的关闭了,再打开时有时没有问题,有时会提示错误 Workspace Unavailable: Workspace in use or c ...

  3. Bloom Filter 算法简介 (增加 Counting Bloom Filter 内容)

    Bloom Filter的中文翻译叫做布隆过滤器,是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询 ...

  4. iOS 项目国际化(多语言支持)

    按下图步骤创建好后使用如下代码即可实现国际化:self.infoLB.text = NSLocalizedString("key", comment: "") ...

  5. FastReport套打 和连续打印

    FastReport套打,纸张是连续的带锯齿的已经印刷好的,类似于通信公司发票这里设计的是客户销售记录.客户有两个要求:1.因为打印纸张是印刷的,明细记录只有8行,所以,如果明细记录如果不到8行,就将 ...

  6. CentOS 7通过Firewall开放防火墙端口

    发现在CentOS 7上开放端口用iptables没效果(或者是sodino没找到正确的命令,传说Centos7 下默认的防火墙是 Firewall,替代了之前的 iptables)… 使用firew ...

  7. Windows编译Opencv

    下载安装CMake 下载Opencv源码 打开CMake,设置源码路径和生成路径,点击Configure选择要生成的版本.(这里要多次Configure,直到所有红色消失!) 勾选BUILD_open ...

  8. Asp .Net core 2 学习笔记(2) —— 中间件

    这个系列的初衷是便于自己总结与回顾,把笔记本上面的东西转移到这里,态度不由得谨慎许多,下面是我参考的资源: ASP.NET Core 中文文档目录 官方文档 记在这里的东西我会不断的完善丰满,对于文章 ...

  9. .net图表之ECharts随笔03-热力地图

    基于01和02 要得到如图所示的热力地图(我从NuGet上下载的包没有heatmap.js文件,没法直接搞热力图,只好暂时先搞着地图.后面尽量搞一下),一般要设置四个参数——title.tooltip ...

  10. Hiho #1075: 开锁魔法III

    Problem Statement 描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜 ...