За последние 24 часа нас посетили 18007 программистов и 1650 роботов. Сейчас ищут 1285 программистов ...

Ввод данных в БД с одного поля через запятую

Тема в разделе "PHP и базы данных", создана пользователем kilroy, 16 апр 2008.

  1. kilroy

    kilroy Активный пользователь

    С нами с:
    25 фев 2008
    Сообщения:
    46
    Симпатии:
    0
    Адрес:
    у тебя пельмени?
    Есть одно поле. В это поле записываються данные через запятую. Ну например "софт, игры, железо".

    Надо что бы каждое слово записывалось в БД как новая отдельная запись а не сразу все слова в одну запись.

    Так понимаю надо реализовывать через регулярное выражение... :?:
     
  2. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    PHP:
    1. <?php
    2. $array = explode(',', $string)
     
  3. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Смотрите в сторону FIELDS TERMINATED BY ","
     
  4. kilroy

    kilroy Активный пользователь

    С нами с:
    25 фев 2008
    Сообщения:
    46
    Симпатии:
    0
    Адрес:
    у тебя пельмени?
    topas

    Вроде смысл ухватил, но реализовать как...
    Нужно написать цикл который инсертит все существующие значения из массива...
    Встал в тупик, втыкаю в мануалы...

    Kreker
    Смотрел. Не понил как это работает. Вставил в инсерт, после чего инсерт перестал работать.Есть какие нить примеры?

    [sql]"INSERT INTO first (one, two) FIELDS TERMINATED BY ',' VALUES (%s, %s)"[/sql]
    ну первое значение это допустим "1,2,3"
     
  5. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
  6. kilroy

    kilroy Активный пользователь

    С нами с:
    25 фев 2008
    Сообщения:
    46
    Симпатии:
    0
    Адрес:
    у тебя пельмени?
    Спс, но помоему не то )
     
  7. kilroy

    kilroy Активный пользователь

    С нами с:
    25 фев 2008
    Сообщения:
    46
    Симпатии:
    0
    Адрес:
    у тебя пельмени?
    Проблему так и не решил есчо. Взял вордпресс и вскрыл его скальпелем.
    Вот функция которая добавляет тэги кажись)
    PHP:
    1.  
    2.     // Add tags.
    3.             if (count($tags) > 0) {
    4.                 $post_tags = array();
    5.                 foreach ($tags as $tag) {
    6.                     $slug = sanitize_term_field('slug', $tag, 0, 'post_tag', 'db');
    7.                     $tag_obj = get_term_by('slug', $slug, 'post_tag');
    8.                     $tag_id = 0;
    9.                     if ( ! empty($tag_obj) )
    10.                         $tag_id = $tag_obj->term_id;
    11.                     if ( $tag_id == 0 ) {
    12.                         $tag = $wpdb->escape($tag);
    13.                         $tag_id = wp_insert_term($tag, 'post_tag');
    14.                         $tag_id = $tag_id['term_id'];
    15.                     }
    16.                     $post_tags[] = $tag_id;
    17.                 }
    18.                 wp_set_post_tags($post_id, $post_tags);
    19.             }
    20.         }
    21.  
    22.  
    Что то где то я невъезжаю(
     
  8. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    kilroy
    PHP:
    1.  
    2. <?php
    3. $string = "a,b,c,d,e,f";
    4. $tags = explode (",", $string);
    5.  
    6. for ($i = 0; $i < sizeof ($tags); $i++){
    7. print "Я <b>".$tags[$i]."</b><br />";
    8. }
    9.  
    10. print_r ($tags);
    11. ?>
    12.  
     
  9. kilroy

    kilroy Активный пользователь

    С нами с:
    25 фев 2008
    Сообщения:
    46
    Симпатии:
    0
    Адрес:
    у тебя пельмени?
    Спасибо, как юзать эксплойд я уже сам догадалсо, хотя может чего то и не уловил.
    Проблема то вот в чом, в запросе БД на ИНСЕРТ, что бы инсертил каждое слово как отдельную запись.
     
  10. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    Ну и что там не то.

    Твою строку "софт, игры, железо" приводишь к виду "('софт'), ('игры'), ('железо')", не проблема думаю.
    Искейпишь ее.
    Передаешь параметром хранимой процедуре.
    Дальше как в ссылке.
     
  11. kilroy

    kilroy Активный пользователь

    С нами с:
    25 фев 2008
    Сообщения:
    46
    Симпатии:
    0
    Адрес:
    у тебя пельмени?
    Извиняюсь, почитаю есче выше указанный url.
    Как поборю проблему, отпишусь.
     
  12. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    И в чем проблема?..

    PHP:
    1.  
    2. <?php
    3. $Words = array ('я', 'люблю', 'php');
    4.  
    5. for ($i = 0; $i < count ($Words); $i++){
    6. mysql_query ("INSERT into `table` VALUES ('".$Words[$i]."');") or die (mysql_error());
    7. }
    8.  
    9. echo 'Данные добавлены';
    10. ?>
    11.  
     
  13. kilroy

    kilroy Активный пользователь

    С нами с:
    25 фев 2008
    Сообщения:
    46
    Симпатии:
    0
    Адрес:
    у тебя пельмени?
    Elkaz - истинный телепат))
    Я когда начал первый раз писать запрос, то у меня впринцепе было почти так же, только не работало, поэтому я подумал что вообще неправельно пишу запрос, а оказывается с синтаксисом немного переборщил, сэнькс.
     
  14. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    Не эффективно.
    Если будет 1 000 слов, то 1 000 раз будет выполняться запрос на INSERT по 1 записи.
    Один запрос на INSERT 1 000 записей более правильно.
    Если возникнет вопрос почему, ответ - идите на мануал. Там это подробно расписано.

    В принципе можно и не через процедуру, хотя IMHO нефиг SQL-коду в PHP-скриптах делать.

    Что-то вроде
    $words = "('софт'), ('игры'), ('железо')";
    $words = mysql_escape_string($words);
    mysql_query ("INSERT into `table` VALUES '$words';") or die (mysql_error());
     
  15. kilroy

    kilroy Активный пользователь

    С нами с:
    25 фев 2008
    Сообщения:
    46
    Симпатии:
    0
    Адрес:
    у тебя пельмени?
    Спс.
    Сделал как показал Elkaz.
    Слов там 1000 точно не будет и не предвитицо. С эскейпом не разобрался...
    После эскейпа строка принимает вид типа ('/софт'/), ('/игры'/), ('/железо'/), если не ошибаюсь, каким образом потом она инсертиться незнаю, чутка почитал про эскейп и все равно не воткнул.
    *Щас времени не особо много для изучения мускуля...дел куча...жопа короче, как обычно)
     
  16. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    kilroy
    Все-таки пример EugeneTM лучше. Я свой привел лишь для наглядности.
    С его примером вы используете только один запрос, а в моем примере - целую кучу. Это действительно не рационально.

    Попробуйте так:
    PHP:
    1.  
    2. <?php
    3. $words = "('текст1'), ('текст2')";
    4. mysql_query ("INSERT into `table` VALUES ".$words) or die (mysql_error());
    5. ?>
    6.  
    Все-таки производительность и оптимизация - вещи хорошие :)
     
  17. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    Именно в таком виде и надо инсертить.
    А про искейпить ...
    Почитай про SQL-иньекции