php连接Mysql 用stmt防注入如何进行模糊查询

Q1:以下代码是正确的吗?即表名和列名也可以用参数化导入吗?
$sqlLink=init_mysql();
$stmt=$sqlLink->stmt_init()
$sql='SELECT?FROM?;';
$stmt->prepare($sql);
$stmt->bind_param("ss",'colA','tableA');
$stmt->execute();
Q2:参数化防止注入,如何进行模糊查询?
1.sql='SELECT*FROMtableAWHEREcolLIKE\'%?%\'';
2.sql="SELECT*FROMtableAWHEREcolLIKE'%?%'";
3.sql='SELECT*FROMtableAWHEREcolLIKE\'%'.'?'.'%\'';
以上方式我经过尝试都不能使用,请问带%模糊查询如何书写SQL的prepare语句?
有一种可行的方式如下:
sql='SELECT*FROMtableAWHEREcolLIKE\'%'.$string.'%\'';
但是失去了防注入的意义,请问有没有正确的方式给予我引导?:-D
UYOU
浏览 325回答 2
2回答

红糖糍粑

不能。原来的prepare引入的目的,是为了预编译,生成执行计划,从而提高性能。本意可不是为了防止sqlinject。如果table都没有了,是无法预编译的。就没有意义了。$sql="SELECT*FROMtableAWHEREcolLIKECONCAT('%',?,'%')";涉及到的是PHPBindingaWildcard的知识。补充:如果不bindparameter。可以直接拼接字符串。对引入的参数,都做一个escape就安全了。(函数:mysql_real_escape_string)

芜湖不芜

$db=newPDO(DB_DSN,DB_USERNAME,DB_PASSWORD,$pdo_options);$query=$database->prepare('SELECT*FROMtableWHEREnameLIKE:name');$query->bindValue(':name','%'.$name.'%',PDO::PARAM_STR);$query->execute();while($results=$query->fetch()){echo$results['name'];}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript