PHP数据库增删改查怎么实现_PHP使用SQL语句操作MySQL数据库CRUD教程

说白了,PHP与MySQL做CRUD时需要做的三件事就是连接好、写入正确、关闭。

扩张, 首先,连接到数据库。
在我去年运行的一个项目中,我直接使用 $conn=mysqli_connect() 连接到本地主机。
如果 $conn 为空,则使用 die() 立即停止脚本。
不然后面查数据的时候就会直接冲突。
还有另一个重要的细节。
如果连接失败,请使用mysqli_connect_error()来确定错误的具体原因。
否则,您将收到“连接失败”消息,并且您不知道这是您的密码还是端口爆炸。

另一点是准备好的语句,例如在插入数据时使用 $stmt->prepare() 来绑定参数。
去年的测试中,有同学直接将用户输入合并到SQL中。
结果,他删除了整个test_db,行话称之为雪崩效应。
事实上,前面稍微耽搁了一点,所以一切都落后了。
后来我意识到不对劲,所以我很快就改用Bind_param(),它用i代表整数,s代表字符串。
又什么也没发生。

一开始我以为直接使用mysqli_query()检查数据就足够了,但后来发现我错了。
如果数据量很大,结果集总是会占用内存。
等等,还有一件事:看到数据后,您需要使用 mysqli_fetch_assoc() 来探索它。
否则,就像打开了一个盲盒,你不知道结果在哪里。

最后注意:在更新和删除任务之前检查 WHERE 条件。
去年有同学刷了一下,把WHERE id=1 写成了WHERE id=1 OR 1 =1 结果整个表的数据都丢失了。
说实话,我心里挺尴尬的。

建议使用PDO而不是mysqli。
它更通用,并且具有更优雅的预处理功能,但这取决于您团队的习惯。

PHP8.1环境下安全连接MySQL5.7数据库的方法

上周我尝试了PHP8 .1 和MySQL5 .7
首先,环境要准备好。
是否安装了PHP8 .1 ? 使用 php -m | grep mysqli 查看扩展名是否存在。
MySQL5 .7 服务是否正在运行? 从命令行或工作台测试连接。

连接参数一定要明确。
服务器是本地主机还是IP? 用户名是 secure_user? 密码是strong_password? 数据库名称是app_db?
PHP $服务器名称 = "本地主机"; $用户名=“安全用户”; $密码=“强密码”; $dbname = "app_db";
$conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("连接失败:" . $conn->connect_error); }
然后安全必须随之而来。

使用准备好的语句。
防止SQL注入。
例如插入数据:
php $stmt = $conn->prepare("插入用户(姓名,电子邮件)值(?,?)"); $stmt->bind_param("ss", $name, $email); $name = "约翰"; $电子邮件=“john@example.com”; $stmt->execute(); $stmt->close();
需要配置 SSL 连接。
是否为 MySQL 配置了 SSL 证书? 连接PHP时添加MYSQLI_CLIENT_SSL:
php $conn = new mysqli($servername, $username, $password, $dbname, 3 3 06 , null, MYSQLI_CLIENT_SSL);
性能和安全性也很重要。

尝试持久连接。
使用 mysqli_pconnect()。
但要小心连接池,不要耗尽资源。

查询需要优化。
常用字段均已建立索引。
不要使用选择。
使用 EXPLAIN 查看慢速查询。

sql 解释从用户中选择 WHERE id=1 ;
静态数据可以被缓存。
使用 Redis/Memcached。
例如:
php $cacheKey = "user_data_1 "; $cachedData = $redis->get($cacheKey); 如果(!$cachedData){ $result = $conn->query("从用户中选择 id=1 "); $cachedData = $结果->fetch_assoc(); $redis->set($cacheKey, $cachedData, 3 6 00); }
权限应该是最小的。
数据库用户仅被授予必要的权限。
例如:
sql 授予选择,插入 app_db。
TO 'app_user'@'localhost';
不要忘记错误处理。

连接错误。
检查MySQL服务是否可用。
3 3 06 端口是否被防火墙允许?
bash mysql 的 systemctl 状态 须藤 ufw 允许 3 3 06
检查 MySQL 日志是否有查询错误。
普通查询日志或慢查询日志。
捕获 PHP 中的错误:
php $result = $conn->query("INVALIDSQL"); 如果(!$结果){ echo "查询错误:" . $conn->错误; }
完整代码如下:
php <?php //配置参数 $服务器名称 = "本地主机"; $用户名=“安全用户”; $密码=“强密码”; $dbname = "app_db";
//创建SSL加密连接 $conn = new mysqli($servername, $username, $password, $dbname, 3 3 06 , null, MYSQLI_CLIENT_SSL); if ($conn->connect_error) { die("连接失败:" . $conn->connect_error); }
//预处理语句查询 $stmt = $conn->prepare("从用户中选择 ID、姓名,其中电子邮件=?"); $stmt->bind_param("s", $email); $email = "user@example.com"; $stmt->execute(); $result = $stmt->get_result();
//处理结果 if ($结果->num_rows > 0) { while ($row = $result->fetch_assoc()) { 回显“ID:”。
$行[“id”]。
“, 姓名: ” 。
$行[“名称”]。

”; } } 否则{ echo "没有结果"; }
//关闭连接 $stmt->close(); $conn->close(); ?>
有几点需要注意。
PHP8 .1 无法使用旧功能。
例如,mysqli_connect()。
使用面向对象。

关注MySQL5 .7 生命周期。
建议升级到8 .0+。

PHP和MySQL补丁需要更新。
已知错误修复。

就是这样。

php连接数据库的三种方式的总结

说实话,当我第一次接触PHP+MySQL时,这三种方法让我很困惑。
但管理项目几年后,我现在觉得选择哪种方法其实很有趣。
关键要看你的具体情况。

我们先来谈谈MySQLi的面向对象方法。
就我个人而言,我真的很喜欢它,尤其是在处理复杂的项目时。
比如我之前接手的一个电商系统,表之间的关系非常混乱。
我用面向对象的方法写了查询条件和链式调用,代码一看就很清晰。
我记得在那个项目中,一个复杂的事务被写成 $query->where(...)->order(...)->limit(...)。
这种嵌套的写法比函数调用直观得多。
然而,有一个小问题。
然后,一个新手同事写了$conn->close()而不是$conn->close(),导致内存泄漏。
这个教训是相当深刻的。

对于面向过程的MySQLi,说实话有点老套了。
在传统公司维护旧代码时,我看到一堆 mysqli_query() 堆叠在一起。
看起来他们正在调用函数。
然而,这种方法有一定的灵活性。
例如,简单的查询使用起来非常简单。
我记得需要快速生成报告并使用过程程序编写一个循环遍历表数据的脚本。
它的运行速度比 OOP 快大约 1 0%。
当时的测试妹子夸我效率高。

说起PDO,给我印象最深的就是数据库之间的迁移。
该公司有一个项目,其基础层是用 PDO 编写的。
然后突然要改用Oracle了,所以改了DSN(数据源名称),但是大部分代码还是没变。
这种便利当时让我感到惊讶。
此外,PDO的异常处理机制非常易于使用。
在我的一个项目中,我使用 try...catch 来捕获 SQL 注入,而不会炸毁服务器。
当时我就觉得这层封装很有价值。
然而,认知是有边界的。
PDO 对某些本机 MySQL 扩展的支持不如 MySQLi 全面,例如 JSON 字段的工作方式。
我发现这件事没那么容易处理。

说实话,你选择哪一个,真的取决于人。
我有一位同事痴迷于过程编程。
他说,如果习惯了,他用函数式风格写的代码就会流畅起来。
对于我来说,我现在的大部分项目都使用 PDO。
跨数据库需求较多,异常处理简单。
你问我标准答案吗?不,关键是你必须知道自己想要什么。