[php] Новичкам: задаем вопросы

Discussion in 'PHP' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. .:EnoT:.

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    Зачем же ты тип DATE поставил у поля?
    Не легче ли поставить тип VARCHAR, получить дату при помощи
    Ну и потом заносить в БД:
     
  2. Dr.Z3r0

    Dr.Z3r0 Leaders of the World

    Joined:
    6 Jul 2007
    Messages:
    284
    Likes Received:
    595
    Reputations:
    567
    По-моему лучше бы все таки поставить не Varchar а Int, как написал je0n, поскольку так удобнее всего работать с датой имхо...
     
    #882 Dr.Z3r0, 15 Nov 2007
    Last edited: 31 May 2011
  3. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Разумеется, лучше использовать поле типа INT и засовывать туда timestamp, ну или если дефолтное значение - INT blablabla NOT NULL DEFAULT CURRENT_TIMESTAMP.
     
  4. .:EnoT:.

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    Для меня наоборот, с INTом были проблемы (возможно из-за точек между числами), поэтому и пользуюсь для даты типом VARCHAR, имхо удобнее для меня так
     
  5. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    .:enot:., лучше откажись от использования типа Varchar для хранения даты, это как минимум затратно - хранить Int в 4 байта или твою дату, в которой ХЗ сколько байт, но уж точно больше 4... Скажем для формата Dd-mm-yyyy Hh:mm:ss - это уже 19 байт. Есть разница? Кроме того, по строковому параметру поиск идёт медленнее, выход - проиндексировать его, но какой смысл индексировать колонку в которой содержатся данные без повторений? Лучше делай по уму... И не допускай таких упущений в серьёзных проектах.
     
    1 person likes this.
  6. XopoIII

    XopoIII Elder - Старейшина

    Joined:
    29 Oct 2007
    Messages:
    386
    Likes Received:
    30
    Reputations:
    0
    я не правильно описал проблему, у меня не просто ссылка а кнопка, я попробовал в кнопке прописать target=_blank и вроде получается но только в опере, а ие открывает в этом же фрейме, а с датой спасибо большое всем помогло=)
     
  7. .:EnoT:.

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    Да, это я знаю. Кстати такая же проблема была с хранением IP в БД. При типе поля INT писал 0, поэтому пришлось использовать VARCHAR. Ну а до серьёзного проекта мне ещё далеко, я тока на стадии изучения php, поэтому щас пишу маленький хоум-паг движок, ну а для него я думаю не особо существенна скорость работы с мускулем в различиях между 4 и 19 байтами :)
    Хотя я ещё со своей первой книжки по php знаю что текстовые поля занимают больше времени вывода чем числовые.
     
    1 person likes this.
  8. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Ip-как раз и надо хранить строкой... А в идеале (если не подразумевается работать с таблицей напрямую через Sql-запросы, иначе усложнит реализацию запросов), нужно разбивать Ip на части, каждую часть преобразовывать в Hex представление, и уже засовывать результат в Char(8) поле... Это будет наиболее оптимально. Например:

    Ip-127.0.0.1

    Ip[0] = 127 (7f)
    Ip[1] = 0 (00)
    Ip[2] = 0 (00)
    Ip[3] = 1 (01)

    и засовывать в базу, в поле Char(8) строку 7f000001.
     
    1 person likes this.
  9. halkfild

    halkfild Members of Antichat

    Joined:
    11 Nov 2005
    Messages:
    365
    Likes Received:
    578
    Reputations:
    313
    используй
    ip2long php
    обратно long2ip

    или средствами mysql
    INET_ATON()
    и обратную ей
    INET_NTOA()
     
    _________________________
    1 person likes this.
  10. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Inet_aton() и Inet_ntoa() я бы не советовал использовать, т.к. это усложнит перенос веб-приложения на другие СУБД, в которых такие фичи отсутствуют. Лучше сделать это преобразование в Php-коде чтобы СУБД работала уже с окончательной версией данных.
     
  11. darckmilord

    darckmilord Elder - Старейшина

    Joined:
    8 Feb 2007
    Messages:
    50
    Likes Received:
    14
    Reputations:
    0
    Всем привет, Ребята помогите пожалуйста... Начал работать с ПХП и решил написать голосование...
    сделал вот таким образом...
    PHP:
    <table class=blok><tr><td class=head><div class=white>
    Голосование:
    </div></td></tr><tr><td><div>
    <?php
    $data
    ='basa/vote.vhg'// Название файла базы банных
    if($action=='done')
    {
      
    $file fopen($data"r+t");
      
    $content=fread($filefilesize($data));
      
    $content=explode('-'$content); 
      if(
    $game==1$content[0]=$content[0]+1;
      if(
    $game==2$content[1]=$content[1]+1;
      if(
    $game==3$content[2]=$content[2]+1;
      if(
    $price==1$content[3]=$content[3]+1;
      if(
    $price==2$content[4]=$content[4]+1;
      if(
    $price==3$content[5]=$content[5]+1;
      echo(
    "
            <center>
            <font size=+2><div style=\"wi-dth: 200px;height: 24px;filter: shadow(color=#999999,direction=150);back-ground: #aaaaaa\">
            Спасибо, за голос!</div></font>
            <table><tr><td width=30%><font face=arial size=1 color=#ffc000>
            класс:<br>
            норма:<br>
            плохо:</td>
           <td width=7%><font face=arial size=1 color=#ffc000>
           
    $content[0]<br>$content[1]<br>$content[2]</td>
           <td width=56%><font face=arial size=1 color=#ffc000>
            WEB кодинг:<br>
            Кодинг:<br>
            Реверсинг:</td>
           <td width=7%><font face=arial size=1 color=#ffc000>
           
    $content[3]<br>$content[4]<br>$content[5]</td>
            </font></td></tr></table></center><hr><a href=javascript:history.back(2)><i>Вернуться назад</i></a>
           "
    );
      
    $content=implode("-"$content);
      
    rewind($file);
      
    fwrite($file$content);
      
    fclose($file);
    }
    else
    {
    echo(
    '
          <center>
          <font size=+2><div style="width: 200px;height: 24px;filter: shadow(color=#999999,direction=150);back-ground: #aaaaaa">
          ПРОГОЛОСУЙ!</div></font>
          <form action=index.php?action=done method=post>
          <table><tr><td>
          <font face=arial size=1 color=#ffc000>Как Вам портал?<br>  
          <input type="radio" name="game" value="1">на 5 баллов<br>
          <input type="radio" name="game" value="2" checked>на 3 балла<br>
          <input type="radio" name="game" value="3">на 1 балл<br><br>
          </td><td><tr><td>
          <font face=arial><font face=arial size=1 color=#ffc000>Ваше направление?<br>
          <input type="radio" name="price" value="1">WEB кодинг<br>
          <input type="radio" name="price" value="2">Кодинг<br>
          <input type="radio" name="price" value="3" checked>Реверсинг</font>
          </td></tr></table><br>
          <input class=but type=submit value=проголосовать>
          </form>
          </center><a href=javascript:history.back(1)><i>Вернуться назад</i></a>
         '
    );
    }
    ?>
    </div></td></tr></table> 
    Скажите пожалуйста как сделать так чтобы проголосовав потом страница сразу отображала результаты а при попытке проголосовать по новой говорила что я уже голосовал.... пробовал с getcookie но повидимому руки кривые и знаний мало..
     
  12. scrat

    scrat кодер

    Joined:
    8 Apr 2007
    Messages:
    625
    Likes Received:
    541
    Reputations:
    3
    darckmilord: можно сделать таблицу в бд в которую будут делаться записи ip|время голосования потом при голосовании проверять как давно голосовал или голосовал ли.либо сессии
     
    1 person likes this.
  13. darckmilord

    darckmilord Elder - Старейшина

    Joined:
    8 Feb 2007
    Messages:
    50
    Likes Received:
    14
    Reputations:
    0
    хммм scrat знаешь я бы рад но есив я на пхп не могу это пока организовать то что говорить про работу с базами данных....
     
  14. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    Моно в файл записать с каких айпи голосовали а при голосовани проверять если такой ип уже голосовал.
    (если это скрипт теоретический и его не будут ставить на сайт.)

    но лучше помойму в кукисах прописать отметку о том что человек проголосовал....
    А вот как это сделать пусть ктото из программистов ответит .. а то я пока не наю как это делать =)
     
    #894 Doom123, 16 Nov 2007
    Last edited: 16 Nov 2007
  15. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    PHP:
    <?

    $file 'ips.txt';
    if( 
    substr_countfile_get_contents($file), getenv('REMOTE_ADDR') ) < )
    {
         
    golosovanie(); // ну здесь само голосование
         
    $fopen fopen$file'a' );
         
    fwrite$fopengetenv'REMOTE_ADDR') );
         
    fclose$fopen );
    }
    else
    {
         echo(
    'Вы уже голосовали');
    }

    ?>
    Нет не лучше. любой может очистить или изменить кукисы.
     
  16. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    а что если сидят 20 человек на сайте с одного ип?

    и если записывать для каждого голосования ип в отдельный файл то это просто будет увеличивать размеры скрипта.... ладно еси проголосуют 20 - 30 а если 30к или 100к?
     
    #896 Doom123, 16 Nov 2007
    Last edited: 16 Nov 2007
  17. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    Попробуй ещё и по браузеру проверять..
    PHP:
    <?

    $file 'ips.txt';
    if( 
    substr_countfile_get_contents($file), getenv('REMOTE_ADDR')." ".$_SERVER["HTTP_USER_AGENT"] ) < )
    {
         
    golosovanie(); // ну здесь само голосование
         
    $fopen fopen$file'a' );
         
    fwrite$fopengetenv'REMOTE_ADDR')." ".$_SERVER["HTTP_USER_AGENT"] );
         
    fclose$fopen );
    }
    else
    {
         echo(
    'Вы уже голосовали');
    }

    ?>
    Как-ниубдь так =)
     
  18. RedBull@12

    RedBull@12 Elder - Старейшина

    Joined:
    5 Nov 2006
    Messages:
    121
    Likes Received:
    21
    Reputations:
    5
    у меня еще вариант с системным временем.
    врядли будет совпалать секунда в секунду время на разных машинах,довольно редко да и при этом с одного айпи+с того же браузера...
    проверка времени.
    Берем выдираем системное время сервера(H1.M1.S1) и полученное нами время на машине у клиента(H2.M2.S3)....дальше из серверного времени вычитаем клиентское время(H1-H2.M1-M2.S1-S),у нас получается разница двух времен(H3.M3.S3)...совпадение мало вероятно...(но и тут же есть проблемы,еслиу клиента слишком медленный инет то данная тема будет ошибаться,хотя кто будет проводить атаку на медленном сервере)...и вписываем эту разницу в файл с ip клиента и его браузером...
    т.е.
    берем выдираем ip,браузер,системное время(через яваскрипт)...потом подается запрос...
    и мы со своей стороны делаем проверку. в 3этапа:
    1-Проверяем наличие данного ip.
    2-если ip уже есть сверяем его браузеры
    3-если сново сопадает - проверяем время.
    Итог-
    если все совпадает то человек уже здесь был,иначе-голосует

    p.s.: ну я бы и не отказался от куков,подделать можно да,но все же как дополнительную проблему для недруга использовать тоже нужно.
    а еще вариант,если человек зашел под ИЕ,то можно выдрать имя компьютера...которое тоже врядли будет совпадать...
    Code:
    var compName=new
    ActiveXObject("WScript.Shell").Environment("Process").item("COMPUTERNAME");
    Да и сессии я думаю тоже есть смысл прикрутить.
     
    #898 RedBull@12, 17 Nov 2007
    Last edited: 17 Nov 2007
  19. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    Вопрос...
    Видел многие люди используют $http_post_vars и $http_get_vars но это вроде тоже самое что и
    $_request да?

    а если это так то почему люди не используют рекюест? это вродь и кароче и правельнее будет или это просто привычка?
     
    1 person likes this.
  20. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    $_REQUEST - это любой метод, т.е. если $_GET['test'] или $_POST['test'] = 'asd', то и $_REQUEST['test'] = 'asd'.
    Некоторые юзают $HTTP_POST(GET)_VARS, для уточнения, что юзается метод пост(гет). Чем отличается он от $_POST(GET) я не знаю =)
     
    1 person likes this.
Thread Status:
Not open for further replies.