PHP使用shell_exec执行带LIKE的MySQL查询报unquoted string错误如何解决
解决方案
根因
报错是多层引号转义冲突导致:代码同时涉及PHP字符串解析、Shell命令解析、MySQL语法解析三层规则,多LIKE条件组合时原有的手动转义方式会提前中断Shell层的字符串边界,触发未引用字符串错误。单个条件时转义序列刚好匹配Shell字符串格式,所以可正常运行。
最优解法
使用PHP内置的escapeshellarg()函数自动处理SQL语句的Shell层转义,完全避免手动嵌套转义引号的混乱,代码如下:
// 直接按MySQL原生语法写查询语句,无需额外转义 $sql = "SELECT TABLE_NAME, COLUMN_NAME FROM information_schema.COLUMNS WHERE COLUMN_NAME LIKE '%lead%' AND TABLE_NAME LIKE '%leads%'"; // escapeshellarg会自动将SQL处理为符合Shell规则的转义字符串 $abc = shell_exec("mysql --user=**** --password=**** --host=**** db -e " . escapeshellarg($sql));
手动转义方案(不推荐)
如果一定要手动写转义,需要严格遵循Shell单引号嵌套规则:Shell单引号包裹的字符串内需要出现单引号时,需写成'\''格式,修正后的写法如下:
$abc = shell_exec("mysql --user=**** --password=**** --host=**** db -e 'SELECT TABLE_NAME,COLUMN_NAME FROM information_schema.COLUMNS WHERE COLUMN_NAME LIKE '\''%lead%'\'' AND TABLE_NAME LIKE '\''%leads%'\'' '");
内容的提问来源于stack exchange,提问作者Neeraj Verma
相关产品推荐
相关产品推荐

