2010-10-13 2 views
0

Это мой текущий вывод $_POST.Как сохранить текущий текущий массив POST в MySQL

Array 
(
    [fullname] => John Doe 
    [email] => [email protected] 
    [phone] => 123-455-6444 
    [address] => 23-10 My Address 
    [zip] => 12345 

    [fullname_2] => Array 
     (
      [0] => M. Owen 
      [1] => V. Persie 
     ) 

    [email_2] => Array 
     (
      [0] => [email protected] 
      [1] => [email protected] 
     ) 

    [phone_2] => Array 
     (
      [0] => 123-455-6555 
      [1] => 222-111-1111 
     ) 

    [submit] => Submit 
) 

Я хочу, чтобы данные, указанные выше, будут храниться в моем текущем формате базы данных, как показано ниже.

id | fullname | email    | phone   | address   | zip | uid 
---------------------------------------------------------------------------------------- 
1 | John Doe | [email protected]  | 123-455-6444 | 23-10 My Address | 12345 | 1 
2 | M. Owen | [email protected]  |    |     |  | 1 
3 | V. Persie | [email protected] |    |     |  | 1 

Я получаю размытие, как сохранить массив в MySQL.

$query = "INSERT INTO users SET fullname ='" . $fullname . "', email ='" . $email . "', phone='" . $phone . "', address ='" . $address . "', zip='" . $zip . "'"; 
$db->rq($query); 

Сообщите мне ключ.

+1

Во-первых, пожалуйста скажите, что вы дезинфицируете свои данные, прежде чем вставлять их. Во-вторых, какой класс DB вы используете? Я не признаю '-> rq()'. – lonesomeday

+0

Во-первых, да. Во-вторых, я получил класс DB из Google и выполнил запрос – delicious

ответ

1

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

Во-вторых, я ничего не знаю о php DB-оболочке от Google (или вы можете указать любое кодовое имя для этого), поэтому я предполагаю, что это один из многих проектов-оболочек db, размещенных на code.google.com. Поскольку я не знаю, кто это, вам придется искать себя в эквиваленте php function mysql_insert_id().

И общий алгоритм сделать то, что вам нужно:

  1. Вставить первую строку, как в вашем примере.
  2. Получить последний идентификатор вставки для этой строки.
  3. Итерация по $_POST['fullname_2'] для сбора данных для следующего запроса
  4. запустить его;)

Пример:

$lastId = $db->functionToGetLastId(); 
$valuesArray = array(); 
foreach($_POST['fullname_2'] as $key => $value){ 
    $fullname = sanitizeFunction($value); 
    $email = sanitizeFunction($_POST['email_2'][$key]); 
    $phone = sanitizeFunction($_POST['phone_2'][$key]); 
    $valuesArray[] = "('{$fullname}','{$email}','{$phone}',{$lastId})"; 
} 
$secondQuery = "INSERT INTO users (fullname,email,phone,uid) VALUES " . implode(',',$valuesArray); 
$db->rq($secondQuery); 
+0

Спасибо, брат! Именно то, что мне нужно. – delicious

1
  1. Подробнее о SQL Injection.
  2. Взгляните на простой SQL INSERT syntax.
  3. Подробнее о escaping special characters в PHP API MySQL.
  4. Подробнее о database normalization.

Измените этот код в соответствии с вашими потребностями:

$query = sprintf("INSERT INTO users (FieldName1, FieldName2, ...) VALUES ('%s', '%s', ...)", mysql_real_escape_string($value1), mysql_real_escape_string($value2), ...); 

Удачи!

+1

4. и прочитал о нормализации базы данных http://en.wikipedia.org/wiki/Database_normalization – pleasedontbelong

+0

@pleasedontbelong: добавлено его как p. 4 :-) – 2010-10-13 20:51:23

1

наилучшим образом использовать PDO и подготовленные запросы вместо вставки запроса «как есть» Что-то вроде этого

$fullname = $_POST['fullname']; 
$phone = $_POST['phone']; 

$conn = new PDO(...); //params of connection 
$stmt = $conn->prepare(' 
    INSERT INTO users 
    (fullname, phone) 
    VALUES 
    (?, ?)' 
); 
$stmt->execute(array(
    $fullname, 
    $phone 
)); 
+0

+1 для приятного решения. Но почему это лучше? И лучше всего для чего? Если я хочу добиться более высокой производительности, я бы, например, придерживался собственного API.Плюс, параметризованные утверждения могут быть менее эффективными в случае с MySQL, потому что сам MySQL не поддерживает их и не поддерживает прекомпилированные утверждения (или это так давно прошло с тех пор, как я посмотрел на него). Итак .. вы знаете, что я говорю. Подробнее :) – 2010-10-14 02:19:12

+0

Хорошо, может быть, «лучше» было слишком субъективно. Однако, если вы хотите использовать собственный API, вы можете попробовать драйвер MySQLi, который также поддерживает подготовленные инструкции почти так же, как PDO. Как я знаю, MySQL поддерживает подготовленные операторы, и это помогает добиться большей производительности, если вам нужно делать одни и те же запросы несколько раз. Основываясь на моем сообщении: $ stmt-> execute (array ('John', '444')); $ stmt-> execute (array ('Bill', '777')). Как я знаю, он должен быть быстрее, чем традиционный mysql_query. Также подготовленные заявления более удобны, потому что, как правило, вам не нужно выполнять дезинфекцию параметров перед вставкой. –

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