За последние 24 часа нас посетили 24365 программистов и 1657 роботов. Сейчас ищут 924 программиста ...

mysql поле text

Тема в разделе "PHP для новичков", создана пользователем Dima4321, 1 фев 2011.

  1. Dima4321

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

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0
    Столкнулся с такой проблемой иногда контент коорый вставляю в базу с помощью textarea и функции insert
    имеет большой вес (т.е. много знаков).

    И по видимому поле TEXT в мускуле не справляется. На какой тип лучше заменить, чтобы не проиграть в производительности и чтобы вбивался текст большого объема. ??

    Попутный вопрос. если только я сам вставляю контент имеет ли смысл делать adsslashes и еще что-либо ??

    Заранее спасибо.
     
  2. Dima4321

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

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0
    Есть идеи склонится к этому. Я прав ?? Кто что думает..??

    MEDIUMBLOB (MEDIUMTEXT)
    Тип BLOB или TEXT, длиной от 1 до 16777215 символов.

    LONGBLOB (LONGTEXT)
    Тип BLOB или TEXT, длиной от 1 до 4294967295 символов.
     
  3. runner

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

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    1) тип поля - здесь зависит от возможного максимального размера вбиваемых данных.
    2) поскольку текст может содержать одиночные и двойные кавычки, то без adsslashes не обойтись
     
  4. Dima4321

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

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0
    а как же вот это

     
  5. runner

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

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    да моя ошибка. Просто я полагаю, что magic_quotes_gpc = Off. Для этого
    1) в начале любого скрипта я вызываю функцию mqn для удаления слэшей
    2) при записи я добавляю слэши
    PHP:
    1.  
    2. function mqn()
    3. {
    4.     {
    5.         $input = array(&$_GET, &$_POST, &$_COOKIE, &$_ENV, &$_SERVER);
    6.         while (list($k,$v) = each($input))
    7.         {
    8.             foreach ($v as $key => $val)
    9.             {
    10.                 if (!is_array($val))
    11.                 {
    12.                     $input[$k][$key] = stripslashes($val);
    13.                     continue;
    14.                 }
    15.                 $input[] =& $input[$k][$key];
    16.             }
    17.         }
    18.         unset($input);
    19.     }
    20. }
    21.  
     
  6. brainiac

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

    С нами с:
    5 янв 2011
    Сообщения:
    33
    Симпатии:
    0
    Адрес:
    Новосибирск
    Отключи волшебные кавычки и прочитай почему их нужно отключать тут
     
  7. Dima4321

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

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0
    Прочитал не только этот кусок , а всю статью ))

    Итог каша в голове.

    будут еще мнения..???

    Что юзать самому прописывать addslashes или пользваться магическими каычками. ??

    Я правильно понял , что доставая данные из базы stripslashes применять не надо ??
     
  8. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Dima4321
    правильно будет не рассчитывать на то, что магические кавычки включены.
    а если магические кавычки включены (!) - отключить их вручную в коде!

    затем, любые данные, поступающие в запрос - экранировать/слэшировать.
    при выборке делать stripslashes не нужно.

    могу расписать полный механизм, если нужно будет
     
  9. Dima4321

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

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0
    Gromo, если не сложно покажи часть своего правильного кода. Я буду использвать его как шаблон.

    Также если кто может подредакируйте мои перлы )).

    Защиты пока никакой и на оптимизацию кода не претендую (хотя знаю. что потенциала у скрипта масса) и можно доводить и доводить до совершенства.

    Вот например мой поиск. Интерполяется элементов массива не лучшая, но зато читаемая ))

    Код (Text):
    1. $query="(SELECT * FROM groups WHERE NAME LIKE '%".strtoupper($_POST['iskat'])."%') UNION ALL (SELECT * FROM groups WHERE GENRE LIKE '%".strtoupper($_POST['iskat'])."%') ";
    2.  
    3. $result = mysql_query($query) or die("Запрос ошибочный");
    4.  
    5.  
    6. echo "<h2>Your results of search</h2><br><br>";
    7.  
    8. echo "<table border=3>";
    9.  
    10. while ($row = mysql_fetch_assoc($result)) {
    11.  
    12.  echo "<tr>";
    13.  
    14.    
    15.   echo"
    16.   <td><a href='albums/$row[NAME].html'>$row[NAME]</a></td>
    17.  
    18.   <td><a href='style/$row[GENRE].html'>$row[GENRE]</a></td>
    19.  
    20.   <td><a href='history/$row[NAME].html'>ABOUT $row[NAME]</a></td>";
    21.  
    22. echo "</tr>";
    23.  
    24.  
    25. }
    26.  
    27. echo "</table>";
    28.  
    29. $n= mysql_num_rows($result);
    30.  
    31.  
    32.  
    33. mysql_free_result($result);
    34.  
    35. if($n>0)
    36.  
    37. {
    38.  
    39.  
    40. echo "<br><br><h2><a href='index.php'>BACK HOME</a></h2>";
    41.  
    42. }
    43.  
    44. else
    45.  
    46. {
    47.  
    48. echo "<br><br>Sorry<br><br>";
    49. echo "<h2><a href='index.php'>BACK HOME</a></h2>";
    50.  
    51. }

    Шооо можно подмандить ?? ))
     
  10. Dima4321

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

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0
    Вот также проста выборка на одной из страниц моего сайта

    Код (Text):
    1. $sql = "SELECT * FROM groups WHERE GENRE = '$page'";
    2.  
    3.  
    4.    $data = mysql_query($sql);
    5.    
    6.    echo "<h1>$page BANDS</h1>";
    7.  
    8.    echo "<table border=3>";
    9.    echo "<tr>
    10.    <th>CDs & ALBUMS</th><th>HISTORY</th></tr>";
    11.  
    12.    while($row=mysql_fetch_assoc($data)) {
    13.  
    14.    echo "<tr>";
    15.  
    16.    echo "
    17.  
    18.    <td><a href='../albums/$row[NAME].html'>$row[NAME]</a></td>
    19.  
    20.  
    21.   <td><a href='../history/$row[NAME].html'>HISTORY OF $row[NAME]</a></td>";
    22.  
    23.   echo "</tr>";
    24.  
    25.   }
    26.   echo "</table>";
    Ну и например добавление

    Код (Text):
    1. $NAME=$_POST['NAME'];
    2. $GENRE=$_POST['GENRE'];
    3. $TEXT=$_POST['TEXT'];
    4. $HIDE=$_POST['HIDE'];
    5.  
    6. /* составить запрос для вставки информации о клиенте в таблицу */
    7. $query = "INSERT INTO $userstable VALUES('ID','$NAME','$GENRE', '$TEXT','PRICE', '$HIDE','ABOUT','ATRIKLES')";
    8. /* Выполнить запрос. Если произойдет ошибка - вывести ее. */
    9. mysql_query($query) or die(mysql_error());
    10. echo "Информация о вас занесена в базу данных.";
    11.  
    12. /* Закрыть соединение */
    13. mysql_close();
    14.  
    15. ?>
    16.  
    17. <br>
    18. <br>
    19. <br>
    20. <a href="add.php">Back Home</a>
    Очень прошу ткните во все косяки носом ! Обругайте ! И покажите как правильно ! )
     
  11. brainiac

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

    С нами с:
    5 янв 2011
    Сообщения:
    33
    Симпатии:
    0
    Адрес:
    Новосибирск
    У тебя данные вставляемые в запрос никак не проверяются, мне уже помогали с этим добрые люди =), создал функцию для фильтрации нехороших данных:
    PHP:
    1.  
    2. function escapeStr($str='', $db = false) //Функция обработки данных
    3.         {
    4.         if(get_magic_quotes_gpc()) $str = stripslashes($str);
    5.         $str = ($db) ? mysql_real_escape_string($str, $db) : mysql_escape_string($str);
    6.         return($str);
    7.         }
    8.     $sqlvars=array('login','pass','type'); //Формируем массив обрабатываемых данных (тут переменные получаемые из POST передачи)
    9.     for ($i=0; $i<count($sqlvars); $i++) //Проходим по массиву
    10.         {
    11.         //Создаём переменные с отфильтрованными данными
    12.         $$sqlvars[$i]=(isset($_POST[$sqlvars[$i]])) ? escapeStr(trim($_POST[$sqlvars[$i]]), $db) : '';
    13.         }
    14.  
    Не знаю на сколько это правильно...но работает.

    И зачем столько раз использовать echo? Удобнее так:
    PHP:
    1.  
    2. <?php
    3. if ($var) {
    4. ?>
    5. тут твоя разметка
    6. <?php
    7. }
    8. else {}
    9. ?>
    10.  
    Так можно разделять пхп и разметку, браузер просто будет выводить всё когда видит ?> до следующего <?php, при этом логика скрипта не нарушается...
     
  12. obliged.act

    obliged.act Активный пользователь

    С нами с:
    1 фев 2011
    Сообщения:
    10
    Симпатии:
    0
    Мой совет: пользуйся PDO, он автоматически экранирует кавычки.
     
  13. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Dima4321

    .htaccess
    и/или так (я использую оба варианта):

    functions.php
    PHP:
    1. <?php
    2.  
    3. function stripslashes_for_array(&$arr){
    4.   foreach($arr as $k=>$v){
    5.     if (is_array($v)){
    6.       stripslashes_for_array($v);
    7.       $arr[$k] = $v;
    8.     } else {
    9.       $arr[$k] = stripslashes($v);
    10.     }
    11.   }
    12. }
    13.  
    14. function fix_magic_quotes_gpc(){
    15.     stripslashes_for_array($_POST);
    16.     stripslashes_for_array($_GET);
    17.     stripslashes_for_array($_COOKIE);
    18.   }
    19. }
    20. ?>
    в начале своего кода подключаешь файл functions.php и вызываешь функцию fix_magic_quotes_gpc();
    таким образом если магические кавычки были включены, то суперглобальные массивы будут
    разъэкранированы в нормальный вид. А дальше в коде уже сам будешь экранировать те данные,
    которые пойдут в базу.

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