2015-06-29 4 views
3

Я использую PDO в веб-приложении, которое я создаю. Я всегда думал (я ошибаюсь на самом деле), что использование prepare должно помочь с одинарными кавычками во вставленных переменных, но кажется, что я что-то пропустил. Я получаю ошибку, вставляющую такие значения, как L'Aquila, где во входных данных есть одна кавычка.pdo подготовить экранированные одинарные кавычки

Мой фактический код:

 $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(); 
    } 

и когда я пытаюсь загрузить строку, содержащую одинарные кавычки, я получаю сообщение об ошибке, как это в то время, пытаясь загрузить строку плацу :

Errori nel caricamento: SQLSTATE [42000]: Ошибка синтаксиса или доступ нарушение: 1064 У вас есть ошибка в синтаксисе SQL; проверьте ручной , который соответствует вашей версии сервера MySQL для правильного синтаксиса использования рядом с «Арми», Сивико = «0», шапочкой = «83100», читты = «Авеллино», пров»в строке 15

Что мне не хватает? Я не думаю, что цитата из PDO может выполнить эту работу для меня, но, возможно, это я не понимаю.

+2

Вы уже используете 'prepare()', но не привязываете фактическую переменную. Найдите 'bindParam()' или параметр 'execute()'. – Sirko

+2

Подготовка - это только первый шаг. Связывание - это шаг 2. Вы должны подготовить запрос к заполнителям и привязать значения к этим заполнителям. Подготовка сама по себе не более безопасна, чем просто запускать запрос сама по себе и открыта для того же уровня sql-инъекции. –

+0

ах, хорошо. Также следует установить bindParam. Попробует. Теперь я думаю о том, как готовятся работы. Благодаря! –

ответ

10

Это помогает с одинарными кавычками, только если вы выполняете параметризованные подготовленные инструкции, иначе все, что вы делаете, это строка конкатенации и должны быть надлежащим образом сформированы 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(), но только связывает значение переменной во время привязки к параметру, а не по значению переменной во время выполнения оператора.

+0

должен работать также с bindParams, правильно? Список всей строки, как '$ s-> bindParam (': protocol', $ protocol)'? Я прошу только для моих знаний, но этот синтакс блестящий! –

+0

@LelioFaieta Да. Я также добавил пример 'bindParam()'.Я предпочитаю 'bindParam()' или 'bindValue()' (в зависимости от использования) передавать массив в 'execute()', так как мне нравится быть конкретным в отношении типов данных, но есть многие, кто предпочитает передавать массив на ' execute() ' –

+0

спасибо! Я знал, что у меня что-то не хватает в логике того, как подготовленное заявление работает, и ваш ответ дал мне недостающую часть! Спасибо :) –

Смежные вопросы