【发布时间】:2015-09-16 07:01:44
【问题描述】:
我在我正在构建的 Web 应用程序中使用 PDO。我一直认为(实际上我错了)使用prepare 应该有助于插入变量中的单引号,但似乎我错过了一些东西。我在插入 L'Aquila 之类的值时遇到错误,其中输入数据中有一个单引号。
我的实际代码是:
$sql = "INSERT INTO anagrafiche SET
id_ndg = '$protocol',
nick = '$nick',
nome = '$nome',
cognome = '$cognome',
ragsoc = '$ragsoc',
leg_rappr = '$leg_rappr',
cod_fisc = '$cod_fisc',
p_iva = '$p_iva',
cf_estero = '$cf_estero',
SAE = '$sae',
RAE = '$rae',
ATECO = '$ateco',
CRCODE = '$crcode',
indirizzo = '$indirizzo',
civico = '$civico',
cap = '$cap',
citta = '$citta',
prov = '$prov',
tel = '$tel',
cell = '$cellulare',
mail = '$mail',
note = '$note',
file_ci = '$file_ci',
file_cf = '$file_cf',
file_visura = '$file_visura',
cittadinanza = '$cittadinanza',
res_fiscale = '$res_fiscale',
is_curatore = '$is_curatore',
is_legale = '$is_legale',
is_tribunale = '$is_tribunale',
is_fornitore = '$is_fornitore' ";
try{
$s = $pdo->prepare($sql);
$s->execute();
}
catch (PDOException $e){
$error = 'Errori nel caricamento: '.$e->getMessage();
}
当我尝试加载包含单引号的字符串时,我在尝试加载字符串时遇到这样的错误 Piazza d'Armi :
错误提示:SQLSTATE[42000]:语法错误或访问 违规:1064 您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本以获得正确的语法 在'Armi'附近使用,civico ='0',cap ='83100',citta ='Avellino', 证明在第 15 行
我错过了什么?我不认为 PDO 报价可以为我完成这项工作,但也许是我不明白这一点
【问题讨论】:
-
您已经使用了
prepare(),但不是实际的变量绑定。查找bindParam()或execute()的参数。 -
准备只是第一步。绑定是第 2 步。您应该准备一个带有占位符的查询并将值绑定到这些占位符。自己准备并不比自己运行查询更安全,并且对相同级别的 sql 注入开放。
-
啊,好的。也应该做bindParam。会试一试。我想现在明白了准备工作的原理。谢谢!
-
你完全错了......如果你正在准备,你应该使用占位符。照原样,你仍然完全容易受到sql injection attacks
-
我知道我是。此代码适用于我使用的 Intranet 应用程序,用于从旧应用程序中大量加载经过清理的数据。