如何在PHP中获取单行数据?相关代码疑问解析
在PHP中使用PDO正确获取单行数据
先说说你提供的代码里存在的几个关键问题,这些问题会导致代码无法正常运行甚至有安全风险:
- 混用了已经被废弃且移除的
mysql_*函数和PDO扩展:mysql_fetch_array这类函数在PHP 7及以上版本已经完全不能用了,必须统一使用PDO或者mysqli - 预编译SQL的参数没有绑定:
select * from memo where num = ?里的占位符?没有绑定对应的变量,预编译查询等于白用 - 错误使用
fetchColumn方法:这个方法是用来获取结果集中某一列的值,而不是整行数据,你想用它获取整行肯定会出错 - 逻辑冗余:循环里重复执行查询,完全没必要,而且会降低性能
下面针对两种常见的获取单行数据的场景,给出正确的PDO实现:
场景1:根据指定条件(比如num值)获取单行数据
如果是要根据某个确定的num值获取对应的单行记录,代码应该这样写:
// 假设你已经正确初始化了PDO连接($pdo变量) $targetNum = 123; // 你要查询的num值,这里可以替换成你的变量 // 准备预编译SQL,使用占位符避免SQL注入 $sql = "SELECT * FROM memo WHERE num = ?"; $stmh = $pdo->prepare($sql); // 绑定参数到占位符,第一个参数是占位符位置(从1开始),第二个是要绑定的值 $stmh->bindParam(1, $targetNum, PDO::PARAM_INT); // num是整数类型,所以指定PARAM_INT // 执行查询 $stmh->execute(); // 获取单行数据,PDO::FETCH_ASSOC会返回关联数组(键是列名) $row = $stmh->fetch(PDO::FETCH_ASSOC); // 检查是否获取到数据 if ($row) { $memo_id = $row['id']; $memo_num = $row['num']; $memo_date = $row['regist_day']; // 其他字段处理... } else { echo "没有找到对应的记录"; }
场景2:获取排序后的第一条数据(比如最新的memo)
如果你是想获取按num倒序排列的第一条记录(也就是最新的那条),代码可以简化成这样:
// 准备SQL,加上LIMIT 1确保只返回单行 $sql = "SELECT * FROM memo ORDER BY num DESC LIMIT 1"; $stmh = $pdo->query($sql); // 这里没有参数,所以可以直接用query // 获取单行关联数组 $row = $stmh->fetch(PDO::FETCH_ASSOC); if ($row) { $memo_id = $row['id']; $memo_num = $row['num']; $memo_date = $row['regist_day']; // 其他字段处理... } else { echo "没有找到任何记录"; }
额外注意事项
- 确保你的PDO连接是正确初始化的,比如:
$dsn = 'mysql:host=localhost;dbname=phptest;charset=utf8mb4'; $username = 'your_username'; $password = 'your_password'; $pdo = new PDO($dsn, $username, $password, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 开启异常模式,方便调试 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC // 默认返回关联数组 ]); - 永远不要使用
mysql_*函数,它们已经被彻底废弃,存在安全风险且不再维护 - 只要SQL里有变量,就一定要使用预编译语句(prepare + bindParam + execute),避免SQL注入攻击
内容的提问来源于stack exchange,提问作者Seo woo
相关产品推荐
相关产品推荐

