2013-11-28 2 views
1

Я использую PHP для написания сценария, который даст мне запрос MySQL, который я буду использовать непосредственно из MySQL Workbench.Escape for DB all Array

Я беру данные из .csv, а затем зацикливаю их, чтобы написать синтаксис SQL с PHP.

Моя проблема заключается в том, чтобы избежать каждой строки внутри массива, чтобы предотвратить получение искаженного запроса.

Как запустить mysqli_real_escape по всему массиву?

ответ

3

Сначала попробуйте использовать PDO. С помощью подготовленных операторов переменные отправляются отдельно от запроса, и вам не нужно беспокоиться о том, чтобы вручную избежать параметров.

Во-вторых, если вам действительно нужно это сделать, используйте mysqli_real_escape_string с картой массива. Нечто подобное должно работать

$escapedArray = array_map(function($val) use ($mysqli) { 
     return is_string($val) ? $mysqli->real_escape_string($val) : $val; 
}, $unescapedArray); 

Или процедурно как этот

$escapedArray = array_map(function($val) use ($mysqli) { 
     return is_string($val) ? mysqli_real_escape_string($mysqli, $val) : $val; 
}, $unescapedArray); 

Причина этого проста. Если какой-либо элемент массива не является строкой, побег будет возвращать null, поэтому вы возвращаете элемент как есть.

EDIT: Для вложенных массивов, вы должны будете использовать array_walk_recursive, вместо array_map.

array_walk_recursive($varArray, function(&$val) use($mysqli) { 
    $val = !is_string($val) ?: mysqli_real_Escape_string($mysqli, $val); 
}); 
+0

Вы попали в ту же ловушку, что и я: ему нужно сгенерировать SQL для скрипта, который будет использовать кто-то другой. Увы, о ПДО не может быть и речи. – siride

+0

Вот почему я также разместил альтернативу. :) – Achrome

+0

golly gosh вы сделали! Любая причина не использовать прямую петлю foreach? – siride

2

Вы можете использовать array_map. Что-то вроде:

$safeArray = array_map ('mysqli_real_escape_string', $originalArray); 
+2

Я собирался принести удар. Положите это после mysql. – christopher

+0

Извините! Это было в вопросе, и я удалил его в спешке! Исправлено ... – danielpsc

+0

Все хорошо! +1 теперь вы исправили. – christopher