Вставить массив в одном поле в MySQL - PullRequest
2 голосов
/ 01 февраля 2010

Я хочу вставить массив в ОДНОМ поле в базе данных mysql, используя PHP ..

это нормально работает:

HTML:

anotherField :<input type="text"  name="anotherField" />

fax :<input type="text"  name="f[]" />
email :<input type="text"  name="f[]" />
phone :<input type="text"  name="f[]" />

PHP (я использую кадр CodeIgniter):

<?php
    function addCustomRow($tableName)
    {

    $arr = $this->input->post('f');
    $field = implode("|", $arr);

        $data = array(
        'anotherField'          => $this->input->post('anotherField'),
        'field'             => $field
        );

        $this->db->insert($tableName, $data);
    }
?>

и я получаю данные в mysql следующим образом

fax|email|phone

НО ..

У меня вопрос ... Я хочу, чтобы в одном поле было много массивов .. Вот так:

fax|email|phone :br: fax|email|phone :br: fax|email|phone ..

Я пробовал что-то вроде этого:

HTML:

First array :
fax :<input type="text" class="inp" name="f[0][0]" />
email :<input type="text" class="inp" name="f[0][1]" />
phone :<input type="text" class="inp" name="f[0][2]" />

Second array :
fax :<input type="text" class="inp" name="f[1][0]" />
email :<input type="text" class="inp" name="f[1][1]" />
phone :<input type="text" class="inp" name="f[1][2]" />

PHP:

<?php
    function addCustomRow($tableName)
    {

    $arr = $this->input->post('f[]');
    $field = implode(":br:", $arr);

        $data = array(
        'anotherField'          => $this->input->post('anotherField'),
        'field'             => $field
        );

        $this->db->insert($tableName, $data);
    }
?>

но там написано Неверно [Уровень важности: Уведомление: преобразование массива в строку] и я получаю данные в MySQL, как это

array :br: array  

РЕДАКТИРОВАТЬ:

Я хочу сделать это так, потому что у меня есть таблица категорий .. и у каждого кота есть свои детали (поля) .. поэтому, когда я добавляю нового кота, я просто делаю что-то вроде этого

       name of cat : <input type="text"  name="name" />

   <!-- Fields -->
    Fields //

    Field 1 :
    title of the filde : <input type="text"  name="f[0][0]" />
    type : <input type="text"  name="f[0][1]" /> <!-- 1= text , 2= select , 3= textarea ..  -->
    default value : <textarea rows="8" cols="20" name="f[0][2]"> </textarea> <!-- if select type write value1::value2::value3  ... -->



Field 2 :
title of the filde : <input type="text"  name="f[1][0]" />
type : <input type="text"  name="f[1][1]" /> <!-- 1= text , 2= select , 3= textarea ..  -->
default value : <textarea rows="8" cols="20" name="f[1][2]"> </textarea> <!-- if select type write value1::value2::value3  ... -->

Field 3 :
title of the filde : <input type="text"  name="f[2][0]" />
type : <input type="text"  name="f[2][1]" /> <!-- 1= text , 2= select , 3= textarea ..  -->
default value : <textarea rows="8" cols="20" name="f[2][2]"> </textarea> <!-- if select type write value1::value2::value3  ... -->

и я могу добавить любое количество полей здесь ..

в базе данных. Я хочу, чтобы данные вставлялись так:

[nameOfBook|1|anyName :br: noOfPages|1|anyNo ]

а у другой кошки вот так например:

[colorOfcar | 2 | красный :: черный :: зеленый: br: цена | 1 | любая цена]

любая помощь?

заранее спасибо ..


@ Джастин Джонсон

спасибо за ваш ответ, но он не работает. Я должен использовать $ data var, чтобы вставить все данные, но я использую ваш ответ, как этот

function addCustomRow($tableName)
{

    $data = array(
        'name'          => $this->input->post('name'),
        'fields'            => serialize($this->input->post('f[]'))
        );

    $this->db->insert($tableName, $data);
}

и я получаю данные mysqyl вот так (b: 0;) !!

//

@ Суку, спасибо .. Я использовал его, прежде чем спрашивать, но я не знал, как .. Как я могу использовать его в моем случае здесь? ..

@ Alex

потому что у меня есть таблица с именем (категории), и у каждого кота есть свои поля, такие как:

carsCat >
  type :
  color:
  details:

BooksCat >
nameOfbook:
writer:
numberOfpage:

и так далее .. Я нахожу этот путь лучшим способом, может быть, в моем случае .. какие-либо предложения?

Ответы [ 5 ]

3 голосов
/ 01 февраля 2010

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

alt text

В этой схеме таблица contact_information связана с таблицей person путем сохранения идентификатора (внешней ссылки) для строки человека. Таким образом, вы можете иметь как можно больше контактных записей для каждого конкретного человека без необходимости встраивать массив данных в одно поле.


В любом случае, чтобы решить проблему как есть, попробуйте сериализовать данные перед тем, как вставить их в БД.

function addCustomRow($tableName) {    
    $data = array(
        'anotherField' => $this->input->post('anotherField'),
        'field'        => serialize($this->input->post('f[]'))
    );

    $this->db->insert($tableName, $data);
}

Редактировать: обновлено до адреса комментария.

3 голосов
/ 01 февраля 2010

Чтобы сохранить массив в одном поле, просто сериализуйте его. Когда вам нужно получить доступ к массиву из базы данных unserialize it.

2 голосов
/ 16 мая 2014

Вам может понадобиться использовать функции serialize () и unserialize () следующим образом:

$string_from_array = serialize($array);

и когда вам нужно восстановить массив:

$array= unserialize($string_from_array);

см. Это для получения дополнительной информации: http://www.wpfasthelp.com/insert-php-array-into-mysql-database-table-row-field.htm

0 голосов
/ 08 марта 2016

ЗНАЧЕНИЕ ВСТАВКИ Массива из формы в базу данных

function addRecord($Table){
        global $connection; // database connection
        extract($Table);

        $entry_date = date('Y-m-d');

        for($i=0; $i< count($project_id); $i++)
        {

            $sql="INSERT INTO expenses(type_id,project_id,amount,exp_date,entry_date,comments,entry_name)
              values('$type_id[$i]','$project_id[$i]','$amount[$i]','$exp_date[$i]','$entry_date','$comments[$i]','$_SESSION[emp_name]')";

            $result=mysqli_query($conn,$sql);
        }
0 голосов
/ 03 февраля 2010

Я сделал это с небольшой хитростью :) Я просто добавляю один ввод heddin со значением (: br :) и сохраняю все имена входов равными (f []) .. вот так:

HTML:

field out of the array :
anotherField :<input type="text"  name="name" />

Field 1 :
title of the field : <input type="text"  name="f[]" />
type : <input type="text"  name="f[]" /> <!-- 1= text , 2= select , 3= textarea ..  -->
value : <textarea rows="8" cols="20" name="f[]"> </textarea> <!-- if select type write value1::value2::value3  ... -->
<input type="hidden" name="f[]" value=":br:" />

Field 1 :
title of the field : <input type="text"  name="f[]" />
type : <input type="text"  name="f[]" /> <!-- 1= text , 2= select , 3= textarea ..  -->
value : <textarea rows="8" cols="20" name="f[]"> </textarea> <!-- if select type write value1::value2::value3  ... -->
<input type="hidden" name="f[]" value=":br:" />

PHP:

function addCustomRow($tableName)
{
$arrF1 = $this->input->post('f');
$f = implode("|", $arrF1);

$data = array(
    'name'  => $this->input->post('name'),
        'fields'    => $f
    );

$this->db->insert($tableName, $data);

}

теперь я получаю данные в mysql следующим образом:

titleOffield|type|value|:brr:|titleOffield|type|value|:brr:

например:

nameOfBook|1|writeTheName|:Br:|NoOfPages|1|value|:br:|

Тогда я могу легко вернуть данные из базы данных mysql следующим образом: (Я использую Smarty!)

выход

  {assign var=fieldsBr value=":br:|"|explode:$r.values} <!-- exploade :br: -->

    {foreach from=$fieldsBr item=ff}
    {assign var=f value="|"|explode:$ff} <!-- exploade | -->
    {$f[0]} :  <b>{$f[2]}</b>  <br />  <!-- title of field :  the value  <br />  -->
    {/foreach}

** Обратите внимание, что я использую 2 разнесенных здесь: один для (: br: |), а другой для (|) ..

Спасибо за любую помощь.

Ахмад ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...