将包含字符串和数字的多维数组插入MySQL

时间:2014-01-05 21:25:36

标签: php mysql sql arrays

我已经看到很多使用foreach和implode函数循环遍历数组的示例,用于为MySQL Insert查询构建sql字符串。但是,所有这些示例都假设Array中的所有值和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_iduser_id是字符串,pricequantity是数字。用引号和逗号来表示它假设所有值都是字符串,在没有引号的情况下使用它来假定所有值都是数字。有没有办法在不必遍历数组中的每个元素的情况下执行此操作?

2 个答案:

答案 0 :(得分: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)

编辑以下是使用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)

答案 1 :(得分:0)

使用array_map:

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

假设您的数据是安全的,否则请使用类似mysql_real_escape或使用PDO预处理语句。