我在我正在构建的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 时会收到类似的错误 :
Errori nel caricamento:SQLSTATE [42000]:语法错误或访问 违规:1064您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以获得正确的语法 使用靠近' Armi',civico =' 0',cap =' 83100',citta =' Avellino', 省'在第15行
我错过了什么?我不认为PDO引用可以为我做这个工作,但也许我认为我没有得到这一点
答案 0 :(得分:12)
只有在执行参数化预准备语句时才能使用单引号,否则您所做的只是字符串连接,并且必须正确形成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) {
...
}
这也为您提供了减轻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) {
...
}
bindValue()
具有与bindParam()
类似的语法,但仅在绑定到参数时绑定变量的值,而不是在语句执行时绑定变量的值。