pdo准备转义单引号

时间:2015-06-29 17:37:12

标签: php mysql pdo

我在我正在构建的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引用可以为我做这个工作,但也许我认为我没有得到这一点

1 个答案:

答案 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()类似的语法,但仅在绑定到参数时绑定变量的值,而不是在语句执行时绑定变量的值。