最终代码:

 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. (区间dp + 记忆化搜索)Treats for the Cows (POJ 3186)

    http://poj.org/problem?id=3186   Description FJ has purchased N (1 <= N <= 2000) yummy treats ...

  2. js-数组方法push

    <script type="text/javascript">        var arr=[1,2,3,4,5]        arr.push(6,7)      ...

  3. MFC中处理UI界面时的注意点

    最近开发时,在处理界面上遇到了下面的问题: 上位机与下位机通信时,如果出现超时,弹出MessageBox提示的情况下,更新界面上的CStatic控件会出现重影. 经过调查发现 原因是由于在UI线程中处 ...

  4. sed,grep,进阶+source+export+环境变量

    三剑客之sed 概括流程:从文件或管道中,可迭代读取. 命令格式: sed(软件) 选项 sed命令 输入文件 增 两个sed命令: a: 追加文本到指定行后 i: 插入到指定行前 sed -i '1 ...

  5. jacoco初探

    # 背景 集团的代码覆盖率平台因为网络问题无法使用,只能自己研究下. 覆盖率是衡量自动化用例效果产品的一个指标,但只是一个辅助指标,覆盖率高并不意味着质量好,但覆盖率低却能说明一些问题, # 对比 覆 ...

  6. WPF Slider滑动条的颜色修改

    效果如下: 鄙人虽然开发WPF有些时间,但之前一直是一些简单Template和Style改改之类的工作,并没有深入研究过.此次为了完成工作,首先也是网上搜了半天,没有找到合适的代码直接拷贝(搜索能力待 ...

  7. 【转】C# Enum,Int,String的互相转换 枚举转换

    Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基 ...

  8. linux shell实现批量关闭局域网中主机端口

    假设局域网中有多台主机,只能开通ssh服务(端口22),如果发现其他服务打开,则全部关闭.通过运行一个shell脚本,完成以上功能.在实际运维中,可以通过puppet等工具更快更好的完成这个功能,所以 ...

  9. babel 7 简单指北

    babel 7 对于 babel 7,babel 的官网已经介绍得非常详细了,但有时感觉文档和实际使用总是差那么一点东西. 主要包 先来看一下主要的包,babel 7 对于包进行了一些简化. @bab ...

  10. 【sping揭秘】4、某些无法注册到IOC容器的对象如何交给spring托管

    可以实现spring的factoryBean 接口,这样可以加入spring的IOC容器 比如现在有一个类叫MyObject,我们没有这个对象的源码,无法对这个对象进行操作,那么我们如何加入sprin ...