MySQLi查询中如何使用表列值作为LIMIT参数?技术求助
解决MySQLi查询中使用另一表列值作为LIMIT参数的问题
我来帮你梳理下问题并修复代码,你遇到的核心问题是没有正确获取tbl_settings表中automatic_number列的值,同时代码里还有几个语法和变量冲突的小问题:
原代码的主要问题
- 条件判断
if($row['automatic'] ==on)中,on是字符串常量,必须用单引号包裹,否则会被当作未定义变量处理 - 赋值
$number= "$result['automatic']";错误:$result是查询结果集对象,不是单行数据,你需要从$row中获取automatic_number列的值 - 内层循环重写了
$result变量,会导致外层循环的结果集被覆盖,后续操作直接出错
修复后的完整代码
// 先获取设置表中的自动数量相关值 $resultSettings = mysqli_query($mysqli,"SELECT automatic, automatic_number FROM tbl_settings"); while($row = $resultSettings->fetch_assoc()){ // 给字符串常量on加上单引号 if($row['automatic'] == 'on'){ // 正确从当前行中取出automatic_number的值 $number = $row['automatic_number']; echo $number; // 更换内层循环的变量名,避免和外层的结果集变量冲突 $quoteSql = mysqli_query($mysqli,"SELECT _quid FROM tbl_quotes where qu_status=0 ORDER BY _quid ASC LIMIT $number"); while($quoteRow = mysqli_fetch_array($quoteSql)){ $qu_time = getDatetimeNow(); $updateResult = mysqli_query($mysqli,"UPDATE tbl_quotes SET qu_status=1, qu_favorite=0, qu_time='$qu_time' where _quid=" . $quoteRow['_quid']); } } }
进一步优化建议(防范SQL注入)
直接把变量拼进SQL语句存在注入风险,建议使用预处理语句来处理LIMIT和UPDATE操作,同时强制转换变量类型确保安全:
// 获取设置表数据 $resultSettings = mysqli_query($mysqli,"SELECT automatic, automatic_number FROM tbl_settings"); while($row = $resultSettings->fetch_assoc()){ if($row['automatic'] == 'on'){ // 强制转为整数,确保LIMIT参数是合法数字 $number = (int)$row['automatic_number']; echo $number; // 预处理查询需要更新的quote ID $stmt = $mysqli->prepare("SELECT _quid FROM tbl_quotes where qu_status=0 ORDER BY _quid ASC LIMIT ?"); $stmt->bind_param("i", $number); $stmt->execute(); $quoteResult = $stmt->get_result(); while($quoteRow = $quoteResult->fetch_assoc()){ $qu_time = getDatetimeNow(); // 预处理更新语句,避免注入风险 $updateStmt = $mysqli->prepare("UPDATE tbl_quotes SET qu_status=1, qu_favorite=0, qu_time=? where _quid=?"); $updateStmt->bind_param("si", $qu_time, $quoteRow['_quid']); $updateStmt->execute(); $updateStmt->close(); } $stmt->close(); } }
这样既解决了你获取automatic_number作为LIMIT参数的需求,也修复了代码里的潜在问题,同时提升了安全性。
内容的提问来源于stack exchange,提问作者Meena Parmar
相关产品推荐
相关产品推荐

