我在我正在构建的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();
}
Run Code Online (Sandbox Code Playgroud)
当我尝试加载包含单引号的字符串时,我在尝试加载字符串Piazza d'Armi时会收到类似的错误 :
错误caricamento:SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法中有错误; 查看与您的MySQL服务器版本对应的手册,以便在'Armi'附近使用正确的语法,civico ='0',cap ='83100',citta ='Avellino',prov'在第15行
我错过了什么?我不认为PDO引用可以为我做这个工作,但也许是我,我不明白这一点
Mik*_*ant 13
只有当您执行参数化的预准备语句时,它才有助于单引号,否则您所做的只是字符串连接,并且必须正确地形成您的SQL.
尝试类似的东西:
$sql = "INSERT INTO anagrafiche SET
id_ndg = :protocol,
nick = :nick,
nome = :nome,
...
";
$params = array(
':protocol' => $protocol,
':nick' => $nick,
':nome' => $nome,
...
);
try{
$s = $pdo->prepare($sql);
$s->execute($params);
} catch (PDOException $e) {
...
}
Run Code Online (Sandbox Code Playgroud)
这还为您提供了减轻SQL注入攻击的额外优势.
如果您想更进一步并强制执行数据类型,可以使用bindValue()或bindParam()
喜欢:
$sql = "INSERT INTO anagrafiche SET
id_ndg = :protocol,
nick = :nick,
nome = :nome,
...
";
try{
$s = $pdo->prepare($sql);
$s->bindParam(':protocol', $protocol, PDO::PARAM_ST);
$s->bindParam(':nick', $nick, PDO::PARAM_ST);
$s->bindParam(':nome', $nome, PDO::PARAM_ST);
...
$s->bindParam(':some_integer', $some_integer, PDO::PARAM_INT);
...
$s->execute();
} catch (PDOException $e) {
...
}
Run Code Online (Sandbox Code Playgroud)
bindValue()具有类似的语法,bindParam()但仅在绑定到参数时绑定变量的值,而不是在语句执行时绑定变量的值.