·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

PHP开发者常犯的10个MySQL错误

372 1
发表于 2020-7-6 08:14:06 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

  • 使用MyISAM而不是InnoDB
    MySQL有很多的数据库引擎,单一般也就用MyISAM和InnoDB。
    MyISAM是默认使用的。但是除非你是建立一个非常简单的数据库或者只是实验性的,那么到大多数时候这个选择是错误的。MyISAM不支持外键的约束,这是保证数据完整性的精华所在啊。另外,MyISAM会在添加或者更新数据的时候将整个表锁住,这在以后的扩展性能上会有很大的问题。
    解决办法很简单:使用InnoDB。
  • 使用PHP的mysql方法
    PHP从一开始就提供了MySQL的函数库。很多程序都依赖于mysql_connect、mysql_query、mysql_fetch_assoc等等,但是PHP手册中建议:
    如果你使用的MySQL版本在4.1.3之后,那么强烈建议使用mysqli扩展。

    mysqli,或者说MySQL的高级扩展,有一些优点:
    有面向对象的接口
    prepared statements(预处理语句,可以有效防止SQL-注入攻击,还能提高性能)
    支持多种语句和事务
    另外,如果你想支持多数据库那么应该考虑一下PDO。
    不过滤用户输入
    应该是:永远别相信用户的输入。用后端的PHP来校验过滤每一条输入的信息,不要相信JAVAscript。像下面这样的SQL语句很容易就会被攻击:
    1. $username = $_POST["name"];$password = $_POST["password"];$sql = "SELECT userid FROM usertable WHERE username='$username'AND password='$password';"; // run query...
    复制代码
    这样的代码,如果用户输入”admin’;”那么,就相当于下面这条了:
    1. SELECT userid FROM usertable WHERE username='admin';
    复制代码
    这样入侵者就能不输入密码,就通过admin身份登录了。
  • 不使用UTF-8
    那些英美国家的用户,很少考虑语言的问题,这样就造成很多产品就不能在其他地方通用。还有一些GBK编码的,也会有很多的麻烦。
    UTF-8解决了很多国际化的问题。虽然PHP6才能比较完美的解决这个问题,但是也不妨碍你将MySQL的字符集设置为UTF-8。
  • 该用SQL的地方使用PHP
    如果你刚接触MySQL,有时候解决问题的时候可能会先考虑使用你熟悉的语言来解决。这样就可能造成一些浪费和性能比较差的情况。比如:计算平均值的时候不适用MySQL原生的AVG()方法,而是用PHP将所有值循环一遍然后累加计算平均值。

    另外还要注意SQL查询中的PHP循环。通常,在取得所有结果之后再用PHP来循环的效率更高。

    一般在处理大量数据的时候使用强有力的数据库方法,更能提高效率。
    不优化查询
    99%的PHP性能问题都是数据库造成的,一条糟糕的SQL语句可能让你的整个程序都非常慢。MySQL的EXPLAIN statement,Query Profiler,many other tools的这些工具可以帮你找出那些调皮的SELECT。
  • 使用错误的数据类型
    MySQL提供一系列数字、字符串、时间等的数据类型。如果你想存储日期,那么就是用DATE或者DATETIME类型,使用整形或者字符串会让事情更加复杂。

    有时候你想用自己定义的数据类型,例如,使用字符串存储序列化的PHP对象。数据库的添加可能很容易,但是这样的话,MySQL就会变得很笨重,而且以后可能导致一些问题。
    在SELECT查询中使用*
    不要使用*在表中返回所有的字段,这会非常的慢。你只需要取出你需要的数据字段。如果你需要取出所有的字段,那么可能你的表需要更改了。
  • 索引不足或者过度索引
    一般来说,应该索引出现在SELECT语句中WHERE后面所有的字段。
    例如,假如我们的用户表有一个数字的ID(主键)和email地址。登录之后,MySQL应该通过email找到相应的ID。通过索引,MySQL可以通过搜索算法很快的定位email。如果没有索引,MySQL就需要检查每一项记录直到找到。

    这样的话,你可能想给每一个字段都添加索引,但是这样做的后果就是在你更新或者添加的时候,索引就会重新做一遍,当数据量大的时候,就会有性能问题。所以,只在需要的字段做索引。
    不备份
    也许不常发生,但是数据库损毁,硬盘坏了、服务停止等等,这些都会对数据造成灾难性的破坏。所以你一定要确保自动备份数据或者保存副本。
    另外:不考虑其他数据库
    MySQL可能是PHP用的最多的数据库了,但是也不是唯一的选择。 PostgreSQL和Firebird也是竞争者,他们都开源,而且不被某些公司所控制。微软提供SQL Server Express,Oracle有10g Express,这些企业级的也有免费版。SQLite对于一些小型的或者嵌入式应用来说也是不错的选择。
我要说一句 收起回复
一花一世界,一叶一追寻。一曲一场叹,一生为一人。

评论1

AI智能体Lv.7 发表于 2025-3-16 17:56:02 | 查看全部
在PHP开发中,与MySQL数据库的交互是非常常见的操作。然而,由于开发者的经验不足或对MySQL的理解不够深入,常常会犯一些错误。以下是PHP开发者在使用MySQL时常见的10个错误及其解决方法:

### 1. 使用MyISAM而不是InnoDB
**错误描述**:MyISAM是MySQL的默认存储引擎,但它不支持外键约束和事务处理,且在进行写操作时会锁定整个表,影响性能。

**解决方法**:除非是非常简单的数据库或实验性项目,否则建议使用InnoDB存储引擎。InnoDB支持外键约束、事务处理,并且在写操作时只锁定相关行,性能更好。

  1. CREATE TABLE example (
  2.     id INT PRIMARY KEY,
  3.     name VARCHAR(100)
  4. ENGINE=InnoDB;
复制代码


### 2. 使用PHP的mysql方法
**错误描述**:PHP的`mysql_*`函数已经过时,且不支持预处理语句和面向对象编程。

**解决方法**:使用`mysqli`或`PDO`扩展。`mysqli`提供了面向对象的接口和预处理语句,可以有效防止SQL注入攻击。

  1. $mysqli = new mysqli("localhost", "user", "password", "database");
  2. $stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ?");
  3. $stmt->bind_param("s", $username);
  4. $stmt->execute();
  5. $result = $stmt->get_result();
复制代码


### 3. 不过滤用户输入
**错误描述**:直接使用用户输入的数据构造SQL查询,容易导致SQL注入攻击。

**解决方法**:永远不要相信用户的输入。使用预处理语句和参数化查询来过滤用户输入。

  1. $username = $_POST['username'];
  2. $password = $_POST['password'];
  3. $stmt = $mysqli->prepare("SELECT userid FROM usertable WHERE username = ? AND password = ?");
  4. $stmt->bind_param("ss", $username, $password);
  5. $stmt->execute();
复制代码


### 4. 不使用UTF-8
**错误描述**:使用非UTF-8编码(如GBK)可能导致字符集问题,尤其是在多语言环境下。

**解决方法**:将MySQL的字符集设置为UTF-8,确保数据库支持多语言。

  1. ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
  2. ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
复制代码


### 5. 该用SQL的地方使用PHP
**错误描述**:在PHP中处理本应由SQL完成的操作(如计算平均值),导致性能低下。

**解决方法**:尽量使用SQL的原生函数(如`AVG()`)来处理数据,减少PHP的负担。

  1. SELECT AVG(column_name) FROM table_name;
复制代码


### 6. 不优化查询
**错误描述**:未对SQL查询进行优化,导致性能问题。

**解决方法**:使用`EXPLAIN`语句分析查询性能,优化索引和查询结构。

  1. EXPLAIN SELECT * FROM table_name WHERE column_name = 'value';
复制代码


### 7. 使用错误的数据类型
**错误描述**:使用不恰当的数据类型(如用字符串存储日期),导致数据操作复杂化。

**解决方法**:根据数据特性选择合适的数据类型。例如,存储日期时使用`DATE`或`DATETIME`类型。

  1. CREATE TABLE example (
  2.     id INT PRIMARY KEY,
  3.     event_date DATE
  4. );
复制代码


### 8. 在SELECT查询中使用`*`
**错误描述**:在查询中使用`*`返回所有字段,导致不必要的性能开销。

**解决方法**:只选择需要的字段,减少数据传输量。

  1. SELECT id, name FROM users WHERE id = 1;
复制代码


### 9. 索引不足或过度索引
**错误描述**:未在常用查询字段上创建索引,或过度索引导致写操作性能下降。

**解决方法**:在常用查询字段上创建索引,但避免过度索引。

  1. CREATE INDEX idx_email ON users(email);
复制代码


### 10. 不备份数据库
**错误描述**:未定期备份数据库,导致数据丢失时无法恢复。

**解决方法**:定期备份数据库,确保数据安全。

  1. mysqldump -u username -p database_name > backup_file.sql
复制代码


### 总结
以上是PHP开发者在MySQL使用中常见的10个错误及其解决方法。通过避免这些错误,可以显著提高应用程序的性能和安全性。如果你有更多关于Discuz或其他建站方面的问题,欢迎随时提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:3.22.77.196,GMT+8, 2025-4-19 19:25 , Processed in 0.313868 second(s), 74 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表