PHP调用Python执行Athena查询,如何转义SQL中的单引号?
问题:PHP调用Python查询Athena时,SQL语句单引号转义无效
我通过PHP调用Python脚本查询Athena,以下是能正常运行的代码:
正常运行的PHP代码
<?php $sql2Py = "'SELECT address,order,status from myDB.order;'"; $output = shell_exec("python3 pythonScript.py $sql2Py"); echo "my result-" . $output; ?>
对应的Python脚本(pythonScript.py)
#!/usr/bin/env python import os import sys from pyathena import connect import pandas # 注:原代码缺少连接实例定义,需补充Athena连接配置(示例如下) conn = connect( s3_staging_dir='s3://你的临时存储桶路径/', region_name='你的AWS区域' ) sql = str(sys.argv[1]) orders = pandas.read_sql(sql,conn) print(orders)
当我给SQL语句添加带单引号的条件时,尝试用反斜杠转义单引号(如下代码)但无效:
$sql2Py = "'SELECT address,order,status from myDB.order where status <> \'Completed\';'";
解决方案
方法一:shell单引号环境下用双单引号转义
在PHP的双引号字符串里,SQL中的单引号需要写成两个连续的单引号——因为shell的单引号环境中,两个单引号会被解析为一个单引号:
$sql2Py = "'SELECT address,order,status from myDB.order where status <> ''Completed'';'";
这样传递到Python脚本的SQL语句会自动变为status <> 'Completed',符合语法要求。
方法二:用escapeshellarg安全处理(推荐)
直接使用PHP的escapeshellarg()函数处理SQL字符串,它会自动完成shell层面的引号包裹和特殊字符转义,既避免手动转义的麻烦,又能防止shell注入风险:
<?php // 直接编写符合语法的SQL语句 $sql = "SELECT address,order,status from myDB.order where status <> 'Completed';"; // 自动处理shell层面的引号和转义 $sql2Py = escapeshellarg($sql); $output = shell_exec("python3 pythonScript.py $sql2Py"); echo "my result-" . $output; ?>
内容的提问来源于stack exchange,提问作者Santosh Pillai
相关产品推荐
相关产品推荐

