PHP数组取值异常求助:从查询结果数组提取值出错
帮你排查PHP查询数组提取值的问题
首先得先提几个关键的点,这些大概率就是你出错的根源:
- *mysql_函数已彻底废弃:你用的
mysql_query、mysql_fetch_array这类函数早在PHP 5.5就被标记为废弃,PHP 7.0之后直接从语言中移除了,不仅存在兼容性问题,安全性也得不到保障,赶紧换成mysqli或者PDO吧,我下面会给你用mysqli的修正示例。 - 致命的SQL注入风险:你直接把
$_SESSION[member_id]和$cycle_number拼进SQL语句里,这等于给黑客留了后门,必须用参数绑定来处理变量,绝对不能直接拼接用户相关的变量! - 数组遍历的隐藏坑:
mysql_fetch_array默认会返回同时包含索引数组和关联数组的结果——比如你的表有个id字段,数组里会同时存在$data_set[0]和$data_set['id']两个相同的值,如果你直接foreach遍历这个数组,会把同一个值重复处理两次,这很可能就是你觉得“数组值错误”的原因。如果只想要字段名作为键的关联数组,应该用mysql_fetch_assoc($result),或者mysql_fetch_array($result, MYSQL_ASSOC)。
看你没写完的foreach($da...,应该是想遍历$data_set里的字段值吧?我给你写个修正后的完整示例,用更安全规范的mysqli方式:
// 先建立mysqli数据库连接 $conn = mysqli_connect('你的数据库主机', '用户名', '密码', '数据库名'); if (!$conn) { die('数据库连接失败: ' . mysqli_connect_error()); } // 使用预处理语句避免SQL注入 $sql = "SELECT * FROM `mlm_pending_transactions` WHERE member_id = ? AND cycle = ? AND credited = 0 AND order_type = 'upgrade_commission_cash'"; $stmt = mysqli_prepare($conn, $sql); // 绑定参数,'ii'表示两个整数类型参数,根据你的字段实际类型调整(s=字符串,i=整数) mysqli_stmt_bind_param($stmt, 'ii', $_SESSION['member_id'], $cycle_number); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); // 遍历结果集,用mysqli_fetch_assoc只获取字段名作为键的关联数组 while ($data_set = mysqli_fetch_assoc($result)) { // 现在$data_set里的键都是表的字段名,比如$data_set['member_id']、$data_set['transaction_amount']等 foreach ($data_set as $field_name => $field_value) { // 在这里调用你的函数,比如: // process_transaction_value($field_value); echo "字段{$field_name}的值是:{$field_value}<br>"; } } // 记得关闭语句和连接 mysqli_stmt_close($stmt); mysqli_close($conn);
另外,建议把$_SESSION[member_id]改成$_SESSION['member_id'],加引号更规范,避免PHP解析时出现意外错误。
如果还是有问题,你可以把完整的foreach代码和具体的错误提示贴出来,这样能更精准地定位问题~
内容的提问来源于stack exchange,提问作者Bangla Tiger
相关产品推荐
相关产品推荐

