pdo准备逃避单引号

Lel*_*eta 3 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();
    }
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()但仅在绑定到参数时绑定变量的值,而不是在语句执行时绑定变量的值.