2012-05-08 15 views
48

Załóżmy Mam tablicę:PHP Implode Ale Wrap Każdy element Cytaty

$elements = array('foo', 'bar', 'tar', 'dar'); 

Następnie chcę zbudować kwerendę DELETE IN SQL:

$SQL = "DELETE FROM elements 
       WHERE id IN ('" . implode(',', $elements) . "')"; 

Problemem jest to, że identyfikatory w tablice elementów nie są podawane osobno. I.E zapytanie wygląda następująco:

$SQL = "DELETE FROM elements 
       WHERE id IN ('foo,bar,tar,dar'); 

Jaki jest najlepszy, najbardziej elegancki sposób na rozwiązanie tego problemu?

+0

Bądź bardzo ostrożny ... jesteś prawdopodobnie otwarte na poważny iniekcję SQL. – Brad

+0

Jaki jest najlepszy sposób zapobiegania iniekcji SQL za pomocą rozwiązania dostarczanego przez 'nickb'? Dzięki. – Justin

Odpowiedz

93

Dodaj cytaty do rozmowy implode (Zakładam, że masz na myśli implode)

$SQL = 'DELETE FROM elements 
      WHERE id IN ("' . implode('", "', $elements) . '")'; 

ta produkuje:

DELETE FROM elements WHERE id IN ("foo", "bar", "tar", "dar") 

Najlepszym sposobem, aby zapobiec przed SQL injection jest upewnienie się, twoje elementy są odpowiednio chronione.

łatwa rzecz do zrobienia, że ​​powinien działać (ale jej nie testowane) jest użycie albo array_map lub array_walk i uciec każdego parametru, tak jak poniżej:

$elements = array(); 
$elements = array_map('mysql_real_escape_string', $elements); 
+0

Doskonały, więc jaki jest najlepszy sposób, aby zapobiec wstrzyknięciu SQL, jak Brad zasugerował z tego rozwiązania? – Justin

+1

@Jusin Edytowałem swoją odpowiedź z sugestią dotyczącą zapobiegania iniekcji SQL. – nickb

+3

@Justin Najlepszym sposobem jest użycie przygotowanych oświadczeń http://php.net/manual/pl/pdo.prepared-statements.php http://php.net/manual/en/mysqli.prepare.php – Petah

0

Można użyć array_walk iteracyjne wszystkie elementy z boku tablicy przekazują odwołanie do elementu i dodają cytaty w następujący sposób.

<?php 

$arr = ['a','b','c']; 

array_walk($arr, function(&$x) {$x = "'$x'";}); 

echo implode(',', $arr); // 'a','b','c' 

?> 
+0

Proszę wyjaśnić, dlaczego tak jest. Może wydawać się to banalne, ale ponieważ nie dodajesz żadnego wyjaśnienia, twoja sugestia jest otwarta na interpretację jego użycia. – Glubus

0

można uruchomić funkcję prosty array_map(), aby owinąć sznurki w cudzysłowie, a następnie owinąć że wokół implode(), aby dodać przecinkami:

$array = ["one", "two", "three", "four"]; 

implode(",", array_map(function($string) { 
    return '"' . $string . '"'; 
}, $array)); 
Powiązane problemy