2014-01-05 2 views
1

Я видел много примеров, проходящих через массив, используя функцию foreach и implode для построения строки sql для запроса MySQL Insert. Однако все эти примеры предполагают, что все значения в массиве Array и все столбцы в таблице MySQL являются строкой или числом. Есть ли способ сделать что-то подобное, но с массивом, который имеет как строки, так и числа, и должен быть вставлен в таблицу MySQL, в которой есть столбцы строк и чисел?Вставьте многомерный массив с двумя строками и числами в MySQL

$insertArr[] = array(
     'order_id' => $orderID, 
     'user_id' => $userID,   
     'price' => $price, 
     'quantity' => $quantity); 

$colNames = "(" . implode(", ",array_keys($insertArr[0])) . ")"; 
foreach ($insertArr as $row) 
{   
    $colValuesArr[] = "('" . implode("', '", $row) . "')"; 
} 
$colValues = implode(", ", $colValuesArr); 
$strsql = "INSERT INTO tbl_orders $colNames 
      VALUES $colValues"; 

Код выше не работает правильно, потому что order_id и user_id являются строками и price и quantity являются числами. Имплицируя его с помощью кавычек и запятых, предполагается, что все значения являются строками, а их развязывание без кавычек предполагает, что все значения являются числами. Есть ли способ, без необходимости перебирать каждый элемент в массиве, чтобы сделать это?

+0

переменная '$ strsql' имеет недопустимый синтаксис SQL. Это может объяснить, почему код не работает. –

+1

MySQL в порядке с цитируемыми числами. Если вы хотите, чтобы все было просто, просто процитируйте все. (Но не забывайте избегать ваших данных!) Или загляните в подготовленные заявления; в конечном счете, они облегчат вам жизнь. – cHao

+0

Gordon Linoff, что не так с синтаксисом $ strsql SQL? Мне кажется хорошо. Я напечатал его, не вижу в этом ничего плохого. Можете быть более конкретными? – user2395238

ответ

1

Предполагая, что вы хотите обрабатывать вещи, & вы не хотите перебирать массивы или использовать подготовленные заявления, я думаю, что это должно сработать. Я немного переформатировал ваш код, но общая логика все еще не повреждена. Логика, которую я добавил, состоит в создании двух отдельных массивов. Один для численных значений. Другой для текстовых значений:

// Test data. 
$orderID = 'testorderid'; 
$userID = 'testuserid'; 
$price = 7.99; 
$quantity = 2; 

// Create the text values array. 
$insertArrText[] = array('order_id' => $orderID, 'user_id' => $userID); 

// Create the numerical values array. 
$insertArrNumerical[] = array('price' => $price, 'quantity' => $quantity); 

// Get the array keys & merge them into one combined array. 
$array_keys = array_merge(array_keys($insertArrText[0]), array_keys($insertArrNumerical[0])); 

// Set the column names. 
$colNames = "(" . implode(", ", $array_keys) . ")"; 

// Loop through the '$insertArrText' 
foreach ($insertArrText as $key => $row) { 

    // Set the numerical values. 
    $numerical_values = implode(", ", $insertArrNumerical[$key]); 

    // Set the text values. 
    $text_values = "'" . implode("', '", $row) . "'"; 

    // Set the column values array. 
    $colValuesArr[] = "(" . $text_values . "," . $numerical_values . ")"; 
} 

// Set the column values string. 
$colValues = implode(", ", $colValuesArr); 

// Create the MySQL query. 
$strsql = "INSERT" 
     . " INTO tbl_orders " . $colNames 
     . " VALUES " . $colValues 
     ; 

// Echo the output for testing. 
echo $strsql; 

Выход этого сценария:

INSERT INTO tbl_orders (order_id, user_id, price, quantity) VALUES ('testorderid', 'testuserid',7.99, 2) 

EDIT Вот переделка с помощью gettype для определения типа строки. Более гибкий & прочный. Разумеется, это использование тестовых данных, но их легко адаптировать к реальным сценариям.

// Test data. 
$orderID = 'testorderid'; 
$userID = 'testuserid'; 
$price = 7.99; 
$quantity = 2; 

// Create an array map based on strings & MySQL DB field values. 
$array_map = array(); 
$array_map['orderID'] = 'order_id'; 
$array_map['userID'] = 'user_id'; 
$array_map['price'] = 'price'; 
$array_map['quantity'] = 'quantity'; 

// Create the text arrays. 
$insertArrText = array(); 
$insertArrNumerical = array(); 

// Set arrays for text and numberical types. 
$text_types = array('string'); 
$numerical_types = array('double','integer'); 

// Lopop through the array map & assign values based on type. 
foreach ($array_map as $array_map_key => $array_map_value) { 
    if (in_array(gettype($$array_map_key), $text_types)) { 
    $insertArrText[0][$array_map_value] = $$array_map_key; 
    } 
    else if (in_array(gettype($$array_map_key), $numerical_types)) { 
    $insertArrNumerical[0][$array_map_value] = $$array_map_key; 
    } 
} 

// Get the array keys & merge them into one combined array. 
$array_keys = array_merge(array_keys($insertArrText[0]), array_keys($insertArrNumerical[0])); 

// Set the column names. 
$colNames = "(" . implode(", ", $array_keys) . ")"; 

// Loop through the '$insertArrText' 
foreach ($insertArrText as $key => $row) { 

    // Set the numerical values. 
    $numerical_values = implode(", ", $insertArrNumerical[$key]); 

    // Set the text values. 
    $text_values = "'" . implode("', '", $row) . "'"; 

    // Set the column values array. 
    $colValuesArr[] = "(" . $text_values . "," . $numerical_values . ")"; 
} 

// Set the column values string. 
$colValues = implode(", ", $colValuesArr); 

// Create the MySQL query. 
$strsql = "INSERT" 
     . " INTO tbl_orders " . $colNames 
     . " VALUES " . $colValues 
     ; 

// Echo the output for testing. 
echo $strsql; 

И выход этого кода:

INSERT INTO tbl_orders (order_id, user_id, price, quantity) VALUES ('testorderid', 'testuserid',7.99, 2) 
+0

это может сработать, если это только для определенной цели. Тем не менее, я пытаюсь создать функцию, которую я мог бы использовать в любое время, и каждый раз, когда массив может быть другим, разные типы значений. – user2395238

+0

Ну, а как насчет использования 'gettype', чтобы определить, является ли значение строкой или целым числом, а затем помещает его в текстовый или числовой массив на основе этого значения? – JakeGould

+0

как бы вы использовали подготовленные заявления? – user2395238

0

Использование array_map:

$row = array_map(function ($a) { 
    if (is_numeric($a)) return $a; 
    else return "'".$a."'"; 
},$row); 

Предполагая, что ваши данные в безопасности, в противном случае, пожалуйста, используйте что-то вроде mysql_real_escape или использовать PDO подготовленных операторов.

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