2014-02-05 2 views
1

Я пытаюсь преобразовать массив (ключ/значение) в оператор SQL.Преобразование массива PHP в SQL-файл?

Я использую Mysqli как например:

if(!$result = $mysqli->query($sql)){throw new Exception("SQL Failed ".__file__." on line ".__line__.":\n".$sql);} 

У меня есть массив, как, например:

Array 
(
[database] => Array 
    (
     [cms_network] => Array 
      (
       [network_id] => 61 
       [network_name] => 
       [network_server_mac_address] => 00:1b:eb:21:38:f4 
       [network_description] => network 
       [network_thermostat_reporting_rate] => 5 
       [network_server_reporting_rate] => 5 
       [network_data_poll_rate] => 5 
       [network_created_by] => 38 
       [network_modified_by] => 1 
       [network_network_id] => 8012 
       [network_language] => en 
       [network_hotel_id] => 68 
       [network_channel] => 0 
       [network_deleted] => 0 
       [network_reported_network_id] => 8012 
       [network_rooms] => 4 
      ) 

    ) 

) 

Как я могу конвертировать [cms_network], чтобы выглядеть следующим образом:

$sql = "UPDATE cms_network set network_id='61', network_name='',  
network_server_mac_address = '00:1b:eb:21:38:f4', .... WHERE network_id='61'" 

Мне больше интересно знать, как объединить пару массива key=>value в key='value' в моем выборе.

Спасибо за помощь!

+0

при условии, что вы установили встроенный массив в переменной '$ cms_network', вы можете использовать' Еогеасп ($ cms_network, как $ ключ = > $ value) {} 'и постройте строку запроса. – Yani

+0

Я бы хотел использовать implode(), но не могу понять, как смешать значения с помощью ключей. При иммобилизации массива я получаю только значения: 61,, 00: 1b: eb: 21: 38: f4, network, 5,5,5,38,1,8012, en, 68,0,0,8012, 4. Мне нужно было бы также развязать ключи и сопоставить их как-то. – Drace

+0

'implode()' не делает ассоциативный массив. Вы можете использовать 'array_walk()', но это было бы излишним. – Yani

ответ

0

Если вы используете синтаксис VALUES, вы можете сделать это одним махом.

mysql_query(" 
UPDATE MyTable 
(. implode(',', array_keys($array['database']['cms_network'])) . ") 
VALUES ('" . implode("','", $array['database']['cms_network']) . "') 
"); 

Это, конечно же, предполагает, что данные уже экранированы.

EDIT: опрятнее версия, что легче читать и поддерживать:

$fields = implode(',', array_keys($array['database']['cms_network'])); 
$values = implode("','", $array['database']['cms_network']); 
mysql_query("UPDATE MyTable ($fields) VALUES ('$values')"); 
+0

Спасибо, я хотел упростить использование implode! все мои данные уже контролируются, поскольку они поступают из другой базы данных на другом сервере (у которой есть данные, защищенные). Еще раз спасибо! – Drace

1

Это должно сработать.

$update_query = "UPDATE `cms_network` SET "; 
$count = 0; 
foreach($array['database']['cms_network'] as $key => $value) { 
    if ($count != 0) { 
     $update_query = $update_query.",".$key."=".$value; 
    } else { 
     $update_query = $update_query.$key."=".$value; 
    } 
    $count++; 
} 
$update_query = $update_query." WHERE ".cms_network."=".$array['database']['cms_network']; 
mysql_query($update_query); 
+1

Он будет генерировать что-то вроде 'network_server_mac_address = 00: 1b: eb: 21: 38: f4', который не является допустимым оператором – zerkms

+0

Он может исправить это самостоятельно с помощью взрыва, взрыва или в любом случае он хочет вставить эти данные. – OfirH

+0

не уверен, как «implode» поможет. Стремитесь показать? – zerkms

2

Я предлагаю вам заполнить массив форматированными парами ключ/значение, а затем взорвать их в конце. Это простой способ добавить нужный , между каждым ключом/значением:

$fields = array(); 
foreach($array['database']['cms_network'] as $key => $value) { 
    // add formatted key/value pair to fields array 
    // e.g. format: network_id = '26' 
    $fields[] = $key . " = '" . $value . "'"; 
} 
$fields = implode(', ', $fields); 
// build your query 
$query = "UPDATE cms_network SET " . $fields . " WHERE network_id = " . $array['database']['cms_network']['network_id'] . " LIMIT 1"; 
// process it... 

Это (SQL мудро) будет вставить любое значение в качестве строки, которая, очевидно, неправильно с целыми колоннами и т.д. Это должно по-прежнему работать в любом случае, но если вам не нужно ставить в условном операторе для того, чтобы обернуть значение в кавычки или нет, like this:

foreach(...) { 
    if(is_numeric($value)) 
     $fields[] = $key . ' = ' . $value; 
    else 
     $fields[] = $key . " = '$value'"; 
} 

Хотя это, вероятно, следует относиться к вашей базы данных типа столбца скорее чем t он тип переменной PHP. До вас они должны хорошо работать с кавычками вокруг целых чисел.

+0

Стоит упомянуть, что вам нужно избегать строковых значений правильно, в этом случае с 'mysql_real_escape_string', иначе вы не можете гарантировать, что запрос будет синтаксически правильным – zerkms

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