1. 数据库连接

问题:在执行sql语句的函数中,因为strsql用单引号引住,所以里面的变量值无法获得,

方法一:

通过字符串连接的方式完成(.):‘字符串’+.变量来构成一条完整的sql语句。如下面代码所示:

//这个函数的作用是,如果输入框的数据发生改变,则更新到服务器中
public function UpdateProjInfo($uPid = 0)
{
$uPid = intval($uPid);
if ($uPid <= 0)
{
echo '{"success":0,"error":"未指定项目"}';
return;
}
//从前端获取两个数据:column和changed_value
$column = $_POST['col'];
$changed_value = $_POST['changed_value'];
$oDBConn = $this->_createMysqlConn();
$oResult = $this->_execSql($oDBConn,'UPDATE `tbl_project` SET '.$column.'='. $changed_value); if ($oResult)
$strRsp = '{"success":1,"messg":"Update Success"}';
else
$strRsp = '{"success":0,"error":"数据更改失败"}';
mysqli_close($oDBConn);
echo $strRsp;
}
};

方法二:预处理语句

在网上还找到一种方式——预处理语句,绑定参数及绑定结果。因为我们项目中封装的是mysqli接口,blabla我也不太清楚,一直没成功,所以只是先贴在这里,供以后参考。

预处理语句对于防止 MySQL 注入是非常有用的。使用预准备语句可提高重复使用语句的性能,在PHP中,使用prepare()方法来进行预准备语句查询,使用execute()方法来执行预准备语句。PHP有两种预准备语句:一种是绑定结果,另一种是绑定参数

1. 工作原理

1)预处理:创建SQL语句模板并发送到数据库。预留的值用参数“?”来标记,例如:

"INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)";

2)数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出。

3)执行:最后,将应用绑定的值传递给参数(”?” 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。

2. 优点

相比于直接执行SQL语句,预处理语句有两个主要优点:

  • 预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)。
  • 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。
  • 预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。

3. 具体实现——MySQLi 预处理语句及绑定参数

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "ikeepstudying"; // 创建连接
$conn = new mysqli($servername, $username, $password, $dbname); // 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
} // 预处理及绑定
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email); // 设置参数并执行
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute(); $firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute(); $firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute(); echo "新记录插入成功"; $stmt->close();
$conn->close();
?>
解析以下实例的每行代码:
"INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"

在 SQL 语句中,我们使用了问号 (?),在此我们可以将问号替换为整型,字符串,双精度浮点型和布尔值。

接下来,让我们来看下 bind_param() 函数:

$stmt->bind_param("sss", $firstname, $lastname, $email);

该函数绑定了 SQL 的参数,且告诉数据库参数的值。 “sss” 参数列处理其余参数的数据类型。s 字符告诉数据库该参数为字符串。

types:绑定的变量的数据类型,它接受的字符种类包括4个,如表所示。

参数types接受的字符的种类和绑定的变量需要一一对应。通过告诉数据库参数的数据类型,可以降低 SQL 注入的风险。

4. MySQLi 预处理语句及绑定结果

所谓绑定结果就是把PHP脚本中的自定义变量绑定到结果集中的相应字段上,这些变量就代表着所查询的记录,绑定结果的示例代码如下:
<?php
$mysqli = new mysqli("localhost","root","root","ikeepstudying"); //实例化mysqli
$query = "select * from MyGuests";
$result = $mysqli->prepare($query); //进行预准备语句查询
$result->execute(); //执行预准备语句
$result->bind_result($id,$firstname,$lastname,$email); //绑定结果
while ($result->fetch()) {
echo $id;
echo $firstname;
echo $lastname;
echo $email;
}
$result->close(); //关闭预准备语句
?>

在绑定结果的时候,脚本中的变量要与结果集中的字段一一对应,绑定完以后,通过fetch()方法将绑定在结果集中的变量一一取出来,最后将预准备语句和数据库连接分别关闭。

5. MySQLi 同时绑定参数和绑定结果

在一个脚本中还可以同时绑定参数和绑定结果,示例代码如下:

<?php
$conn = new mysqli("localhost","root","root","ikeepstudying"); //实例化mysqli
$query = "select * from MyGuests where id < ?";
$result = $conn->prepare($query);
$result->bind_param("i",$id); //绑定参数
$id=4;
$result->execute();
$result->bind_result($id,$number,$name,$age); //绑定结果
while ($result->fetch()) {
echo $id;
echo $firstname;
echo $lastname;
echo $email;
} $result->close();
$conn->close();
?>

详情请看:网页链接

PHP开发中遇到的问题的更多相关文章

  1. TDD在Unity3D游戏项目开发中的实践

    0x00 前言 关于TDD测试驱动开发的文章已经有很多了,但是在游戏开发尤其是使用Unity3D开发游戏时,却听不到特别多关于TDD的声音.那么本文就来简单聊一聊TDD如何在U3D项目中使用以及如何使 ...

  2. React在开发中的常用结构以及功能详解

    一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google. 但是能把算法说清楚,虚拟DOM说清楚的聊聊无几.对开发又没卵用,还不如来点干货看看咋用. 二.结构如下: impo ...

  3. Android学习探索之Java 8 在Android 开发中的应用

    前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...

  4. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

  5. 总结iOS开发中的断点续传那些事儿

    前言 断点续传概述 断点续传就是从文件赏赐中断的地方重新开始下载或者上传数据,而不是从头文件开始.当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会从头下载,这样很 ...

  6. 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

    提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...

  7. C#开发中使用配置文件对象简化配置的本地保存

    C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...

  8. iOS开发中静态库之".framework静态库"的制作及使用篇

    iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...

  9. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  10. Java开发中的23种设计模式详解(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

随机推荐

  1. JAVA虚拟机的生命周期

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

  2. mysql行转列,列转行

    行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清 ...

  3. [js高手之路]Node.js实现简易的爬虫-抓取博客所有文章列表信息

    抓取目标:就是我自己的博客:http://www.cnblogs.com/ghostwu/ 需要实现的功能: 抓取博客所有的文章标题,超链接,文章摘要,发布时间 需要用到的库: node.js自带的h ...

  4. 浅谈脚本化css(一)

    读写css属性 每一个dom元素都有一个属性style,dom.style里面存放的这个元素的行间样式,我们可以通过这个属性来读写元素的行间样式. 注意: 1.我们碰到float这样的关键字属性的时候 ...

  5. BZOJ4977: [[Lydsy1708月赛]跳伞求生

    传送门 直接贪心 考虑到 \(n\) 个人的贡献都是 \(a_i\),另外 \(m\) 个人的贡献都是 \(c_i-b_i\) 首先 \(a_i>b_j\) 的限制不好做,所以将 \(a,b\) ...

  6. js-权威指南学习笔记13

    第十三章 Web浏览器中的JavaScript 1.在客户端JS中,window对象也是全局对象. 2.window对象中其中一个最重要的属性是document,它引用Document对象. 3.JS ...

  7. [NodeJs] 用Nodejs+Express搭建web,nodejs路由和Ajax传数据并返回状态,nodejs+mysql通过ajax获取数据并写入数据库

    小编自学Nodejs,看了好多文章发现都不全,而且好多都是一模一样的 当然了,这只是基础的demo,经供参考,但是相信也会有收获 今天的内容是用Nodejs+Express搭建基本的web,然后呢no ...

  8. 创建vue项目 webpack+vue

    # 全局安装 vue-cli $ npm install -g vue-cli # 创建一个基于 "webpack" 模板的新项目 根据提示填写项目信息 && 对项 ...

  9. Java 实验案例(多态)

    实验任务 任务一:图形面积周长计算小程序 任务二:饲养员喂养动物程序 实验内容: 任务一: 图形面积周长计算 任务目的: 掌握多态的含义及应用场合 掌握上转型对象和多态的实现 掌握abstract关键 ...

  10. oracle 网络配置 及 pl/sql 连接配置

    oracle网络配置有三个文件,它们都在D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN 这个文件夹下面,有sqlnet.ora.l ...