当前位置:网站首页>MySQL预处理及过程与对象创建数据库
MySQL预处理及过程与对象创建数据库
2022-08-08 23:49:00 【一殊酒】
预处理语句的工作原理
- 预处理:创建 SQL 语句模板并发送到数据库,预留的值使用参数
?标记
INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
bind_param() 函数:对于问号 (?),可以替换为整型,字符串,双精度浮点型和布尔值,每个参数都需要指定类型,通过告诉数据库参数的数据类型,可以降低 SQL 注入的风险
$stmt->bind_param("sss", $firstname, $lastname, $email);
参数有以下四种类型: i - integer(整型);d - double(双精度浮点型);s - string(字符串);b - BLOB(binary large object:二进制大对象);
- 数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出
- 执行:最后,将应用绑定的值传递给参数(
?标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。 - 主要优点
- 预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)
- 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句
- 预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性
Laravel普通验证登录
//普通登录方式
//读取数据,写入数据。
$sql = "select * from lg_user where userid='1' and password='123456'";
$conn = mysqli_connect("127.0.0.1",'root','',"lg_shop") or die("链接数据库错误".mysqli_error());
$rs = mysqli_query($conn,$sql) or die("sql语句错误");//查询数据库。
//对数据进行处理
while($user = mysqli_fetch_array($rs))//从结果集中抓取一条记录
{
echo "登陆成功";
var_dump($user);
}
Laravel验证登录预处理语句
$userid = 1 ; //sql注入。
$pwd = '123456' ;//加密密码。
//建立数据库服务器的链接。(选择数据库,设置客户字符集)
$conn = mysqli_connect("127.0.0.1",'root','',"lg_shop") or die("链接数据库错误".mysqli_error());
mysqli_query($conn,"set names utf8");
//定义用户数组
$user = array();
//prepare预处理语句登录
//设置预处理sql语句
$stmt = mysqli_prepare($conn,"select * from lg_user where userid=? and password=?");
mysqli_stmt_bind_param($stmt,"ds",$userid,$pwd);//设置参数
mysqli_stmt_execute($stmt);//执行sql语句
//绑定结果集
mysqli_stmt_bind_result($stmt,$user['uid'],$user['uname'],$user['pwd'],$user['ddd'],
$user['address'],$user['tel'],$user['reg']);//结果集
mysqli_stmt_fetch($stmt);//抓取一条结果
var_dump($user);
mysql与mysqli
- 关联
- 两者都是php方面的函数集,与mysql数据库关联不大
- 在php5版本之前,一般是用php的mysql函数去驱动mysql数据库的,比如mysql_query()的函数,属于面向过程;在php5版本以后,增加了mysqli的函数功能,某种意义上讲,它是mysql系统函数的增强版,更稳定更高效更安全,与mysql_query()对应的有mysqli_query(),属于面向对象,用对象的方式操作驱动mysql数据库
- 区别
- mysql是非持继连接函数,mysql每次链接都会打开一个连接的进程
- mysqli是永远连接函数,mysqli多次运行mysqli将使用同一连接进程,从而减少了服务器的开销。mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法
- 用法
- mysql(过程方式)
$conn = mysql_connect('localhost', 'user', 'password'); //连接mysql数据库
mysql_select_db('data_base'); //选择数据库
$result = mysql_query('select * from data_base');//第二个可选参数,指定打开的连接
$row = mysql_fetch_row( $result ) ) //只取一行数据
echo $row[0]; //输出第一个字段的值
- mysqli(对象方式)
//要使用new操作符,最后一个参数是直接指定数据库,假如构造时候不指定,那下一句需要$conn -> select_db('data_base')实现
$conn = new mysqli('localhost', 'user', 'password','data_base');
$result = $conn -> query( 'select * from data_base' );
$row = $result -> fetch_row(); //取一行数据
echo row[0]; //输出第一个字段的值
- mysqli以过程式的方式操作,有些函数必须指定资源,比如mysqli_query(资源标识,SQL语句),并且资源标识的参数是放在前面的,而mysql_query(SQL语句,‘资源标识’)的资源标识是可选的,默认值是上一个打开的连接或资源
- 使用
new mysqli('localhost', usenamer', 'password', 'databasename');会报错,提示如下:Fatal error: Class 'mysqli' not found in ...:一般是mysqli是没有开启的,因为mysqli类不是默认开启的,win下要改php.ini,去掉php_mysqli.dll前的;,linux下要把mysqli编译进去
mysql_connect()与mysqli_connect()
- 使用mysqli,可以把数据库名称当作参数传给mysqli_connect()函数,也可以传递给mysqli的构造函数;
- 如果调用mysqli_query()或mysqli的对象查询query()方法,则连接标识是必需的
- mysql_connect()不会忽略错误,将错误显示到客户端
new mysqli与mysql_connect()语句
new mysqli:对象化
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// 创建连接
$conn = new mysqli($servername, $username, $password);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 创建数据库
$sql = "CREATE DATABASE myDB";
if ($conn->query($sql) === TRUE) {
echo "数据库创建成功";
} else {
echo "Error creating database: " . $conn->error;
}
//关闭数据库
$conn->close();
?>
mysql_connect():过程化
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// 创建连接
$conn = mysqli_connect($servername, $username, $password);
// 检测连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
// 创建数据库
$sql = "CREATE DATABASE myDB";
if (mysqli_query($conn, $sql)) {
echo "数据库创建成功";
} else {
echo "Error creating database: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
边栏推荐
- 生成二维码容错级别的问题
- Formatting of time objects
- HCIP2---第一天实验
- 深入理解计算系统第三章程序的机器级表达总结
- 并发编程第10篇,CountDownLatch(计数器)和Semaphore(信号量)
- 获取一星期前的时间 n-1 为含当天 一周7天 7-1
- 洛谷P4197 Peaks 线段树合并
- 跨域请求浏览器无法显示set-cookie,坑了我一晚上
- 根據百度地图返回的地址,截取省,市,区
- grpc系列3-自定义端镜像GOAWAY with error code ENHANCE_YOUR_CALM and debug data equal to “too_many_pings“
猜你喜欢

实用小技能:一键获取Harbor中镜像信息,快捷查询镜像
![[Deep Learning] TensorFlow Learning Road One: Introduction to TensorFlow and Implementation of Linear Regression and Logistic Regression](/img/1d/68ebf357a93d718cfdbefeaaf623fa.png)
[Deep Learning] TensorFlow Learning Road One: Introduction to TensorFlow and Implementation of Linear Regression and Logistic Regression

postgresql源码学习(35)—— 检查点⑤-检查点中的XLog清理机制

51nod 2887 抓小偷 平面图最小割转换成最短路

(2022牛客多校二)L-Link with Level Editor I(动态规划)

并发编程第3篇,volatile原理分析

Risk Control Modeling 1: Definition of Good and Bad Labels

【瑞吉外卖】day04:员工分页查询、启用/禁用员工账号、编辑员工信息

OSPF总结作业

深入理解计算系统第三章程序的机器级表达总结
随机推荐
Common problems in installing mysql in linux environment and using it
STM8L LCD digital tube driver, thermometer LCD display
机器学习建模高级用法!构建企业级AI建模流水线
【LaTex异常与错误】 - 公式编号的参考引用命令\eqref发生错误Undefined control sequence——可能是因为没加载宏包amsmath
ViewOverlay与ViewGroupOverlay
BGP第二天总结作业
08 Spark on RDD 依赖关系
时间对象的格式化
LightningChart .NET 10.3.2 Crack 支持旧项目直接升级
11 Spark on RDD CheckPoint
ABP中的数据过滤器
Formatting of time objects
官方一键安装redis集群
并发编程第4篇,锁的分类
WeChat applet error undefined Expecting 'STRING','NUMBER','NULL','TRUE','FALSE','{','[', got ]Solution
[QNX Hypervisor 2.2用户手册]10.12 ser8250vdev ser8250 options
office:如何查看并下载office账户的订阅软件
启牛商学院靠不靠谱呢?证券账户开了安全吗
51nod2861 2-sat
移动端真机调试:chrome://inspect/#devices打开inspect后出现空白页