
在 CodeIgniter 等框架中,直接将对象属性(如 $student_value->id)嵌入双引号字符串的 SQL 查询中,常因语法解析失败或变量未被正确展开而导致查询无结果;根本原因在于 PHP 对复杂变量表达式(如对象属性访问)在双引号字符串中的解析限制。
在 codeigniter 等框架中,直接将对象属性(如 `$student_value->id`)嵌入双引号字符串的 sql 查询中,常因语法解析失败或变量未被正确展开而导致查询无结果;根本原因在于 php 对复杂变量表达式(如对象属性访问)在双引号字符串中的解析限制。
当你编写如下代码时:
$query = $this->db->query("SELECT `rem1` FROM `exam_group_exam_results`
WHERE `exam_group_class_batch_exam_student_id` = $student_value->id
AND `exam_group_class_batch_exam_subject_id` = 1");
PHP 在双引号字符串中仅支持简单变量(如 $var)或数组下标(如 $arr['key'])的自动解析,而不支持链式对象属性访问(如 $student_value->id)的内联展开。尽管 var_dump($student_value->id) 能正常输出 11,但在字符串中,$student_value->id 实际未被求值,而是被当作字面量文本处理(甚至可能触发解析警告),最终生成的 SQL 类似:
WHERE ... = ->id AND ...
这显然语法错误,导致查询返回空结果。
✅ 正确做法:先将对象属性赋值给一个简单变量,再插入字符串:
$id_value = $student_value->id; // 注意:此处是对象访问,需用 ->,不是 ['id']
$query = $this->db->query("SELECT `rem1` FROM `exam_group_exam_results`
WHERE `exam_group_class_batch_exam_student_id` = $id_value
AND `exam_group_class_batch_exam_subject_id` = 1");
$getrem = $query->row();
echo $getrem ? $getrem->rem1 : 'No result found';
⚠️ 更重要的是:强烈建议避免字符串拼接方式执行 SQL,因其极易引发 SQL 注入漏洞。应改用 CodeIgniter 的查询绑定(Query Binding)机制:
$query = $this->db->query(
"SELECT `rem1` FROM `exam_group_exam_results`
WHERE `exam_group_class_batch_exam_student_id` = ?
AND `exam_group_class_batch_exam_subject_id` = ?",
[$student_value->id, 1]
);
$getrem = $query->row();
echo $getrem ? $getrem->rem1 : 'No result found';
✅ 优势:
- 自动转义参数,杜绝 SQL 注入;
- 支持任意变量类型(对象属性、数组元素、函数返回值等);
- 语义清晰,可读性与安全性兼备。
? 总结:
- 不要在双引号 SQL 字符串中直接写
$obj->prop或$arr['key']—— 先提取为简单变量; - 优先使用查询绑定(
?占位符 + 参数数组),而非字符串拼接; - 开发时开启 PHP 错误报告(
error_reporting(E_ALL); ini_set('display_errors', 1);),便于及时发现未解析变量等隐性错误。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











