如何使用mysqli或PDO扩展替换旧版mysql函数完成代码升级
PHP废弃mysql_*系列函数升级方案
核心升级改动点
- 替换所有
mysql_前缀函数为对应mysqli_系列函数或PDO方法,所有数据库操作必须传入连接实例 - 废弃直接拼接SQL变量的写法,改用预处理参数绑定,解决原有代码的SQL注入安全风险
- 优化多余的PHP标签嵌套,提升代码可读性
方案1:MySQLi实现(面向过程风格,适配原有代码习惯)
首先替换你项目中原有的数据库连接代码:
// 替换原有mysql_connect、mysql_select_db逻辑 $conn = mysqli_connect('数据库主机地址', '数据库用户名', '数据库密码', '数据库名称'); if (!$conn) { die('数据库连接失败: ' . mysqli_connect_error()); } // 设置编码,和你项目原有编码保持一致即可,这里以utf8为例 mysqli_set_charset($conn, 'utf8');
升级后的业务代码如下:
<?php $categories = mysqli_query($conn, "SELECT * FROM (SELECT * FROM tubecatget ORDER BY RAND() LIMIT 32) AS `random_pages` ORDER BY catviews DESC"); while($row = mysqli_fetch_array($categories)) { $movtitles = $row['cattitle']; $id = $row['id']; $seo = $row['catseo']; // 预处理语句避免SQL注入 $stmt = mysqli_prepare($conn, "SELECT vidthumb FROM tubevideos WHERE vidcat = ? ORDER BY vidviews DESC, id DESC LIMIT 1"); // 第二个参数i表示绑定的参数为整数类型,若vidcat为字符串类型请改为s mysqli_stmt_bind_param($stmt, "i", $id); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $thumb = mysqli_fetch_array($result); $link = $thumb['vidthumb']; ?> <a title="<?php echo $movtitles; ?>" href="<?php echo $seo; ?>.html"> <img src="<?php echo $link; ?>" width="240" height="180" alt="<?php echo $seo; ?>" /> <span><?php echo $movtitles; ?></span> </a> <?php } ?>
方案2:PDO实现(支持多数据库适配,通用性更强)
首先替换项目原有的数据库连接代码:
try { $pdo = new PDO('mysql:host=数据库主机地址;dbname=数据库名称;charset=utf8', '数据库用户名', '数据库密码'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { die('数据库连接失败: ' . $e->getMessage()); }
升级后的业务代码如下:
<?php $categories = $pdo->query("SELECT * FROM (SELECT * FROM tubecatget ORDER BY RAND() LIMIT 32) AS `random_pages` ORDER BY catviews DESC"); while($row = $categories->fetch(PDO::FETCH_ASSOC)) { $movtitles = $row['cattitle']; $id = $row['id']; $seo = $row['catseo']; // 预处理语句避免SQL注入 $stmt = $pdo->prepare("SELECT vidthumb FROM tubevideos WHERE vidcat = ? ORDER BY vidviews DESC, id DESC LIMIT 1"); $stmt->execute([$id]); $thumb = $stmt->fetch(PDO::FETCH_ASSOC); $link = $thumb['vidthumb']; ?> <a title="<?php echo $movtitles; ?>" href="<?php echo $seo; ?>.html"> <img src="<?php echo $link; ?>" width="240" height="180" alt="<?php echo $seo; ?>" /> <span><?php echo $movtitles; ?></span> </a> <?php } ?>
提示:如果你的
id字段非数字类型,仅需要调整MySQLi方案中mysqli_stmt_bind_param的类型参数即可,PDO无需额外调整。
内容的提问来源于stack exchange,提问作者Serkan Demir
相关产品推荐
相关产品推荐

