2012-05-08 14 views
48

Ben bir dizi var varsayalım Alıntılar eleman dizisi her biri ayrı ayrı alıntılanmamıştır. I.E sorgu gibi görünüyor:PHP Implode Ama Wrap Her Eleman olarak

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

Bunu düzeltmek için en iyi, en elegants yolu nedir?

+0

Muhtemelen bazı ciddi SQL enjeksiyonlarına açıktır. – Brad

+0

"Enjeksiyon" tarafından sağlanan çözümle SQL enjeksiyonunu önlemenin en iyi yolu nedir? Teşekkürler. – Justin

cevap

93

implode çağrısında tırnak ekleyin:

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

SQL enjeksiyonu karşı önlemenin en iyi yolu emin olmaktır:

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

Bu üretir (Sana implode demek varsayarak) öğeleriniz doğru şekilde kaçtı. Sen yineleme için array_walk kullanabilirsiniz

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

Mükemmel, bu yüzden Brad'in bu çözümle önerdiği gibi SQL enjeksiyonuna karşı önlem almanın en iyi yolu nedir? – Justin

+1

@Jusin Cevabımı SQL enjeksiyonu önlemeye yönelik bir öneriyle düzenledim. – nickb

+3

@Justin Hazırlanmış ifadeleri kullanmanın en iyi yolu http://php.net/manual/en/pdo.prepared-statements.php http://php.net/manual/en/mysqli.prepare.php – Petah

0

:

(ama onu test etmedim) bu çalışması gerekir yapmanın kolay şey çok gibi array_map veya array_walk, ve ya her parametreyi kaçmak kullanmaktır dizideki tüm elemanlar diziyi referansa öğeye aktarır ve alıntıları aşağıdaki şekilde ekler.

<?php 

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

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

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

?> 
+0

Lütfen bunun neden bir cevap olduğuna dair açıklama ekleyin. Size önemsiz görünebilir, ancak herhangi bir açıklama eklemediğinizden, öneriniz kullanımı hakkında yorumlamaya açıktır. – Glubus

0

Sen virgül eklemek için tırnak içinde dizeleri sarın ve daha sonra implode() etrafında o sarmak için basit array_map() fonksiyonunu çalıştırabilirsiniz: sen ... çok dikkatli olun

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

implode(",", array_map(function($string) { 
    return '"' . $string . '"'; 
}, $array)); 
İlgili konular