За последние 24 часа нас посетили 186899 программистов и 2134 робота. Сейчас ищут 1629 программистов ...

Уменьшение кода

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

  1. klon5555

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

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Возможно ли уменьшить размер данного кода?
    Быть может я чего-то не знаю, и налепил тут лишнего...)
    Код (Text):
    1. if(empty($title) || empty($cutdesc) || empty($fulldesc)){
    2.     header("Location: /?added=0");
    3.     }else{
    4.     $result = mysql_query("INSERT INTO `news` (`title`, `cutdescription`, `description`, `author`, `date`) VALUES ('$title', '$cutdesc', '$fulldesc', '$author', NOW())");
    5.     if($result==1){$adding=1;}else{$adding=0;}
    6.     header("Location: /?added=$adding");}
    задача: если новость добавлена - послать header с 1, если нет - с 0
    + проверка на пустоту одного, или нескольких полей
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. if(empty($title) || empty($cutdesc) || empty($fulldesc))
    2. {
    3.     header("Location: /?added=0");
    4. }else{
    5.         $result=mysql_query("INSERT INTO `news` (`title`, `cutdescription`, `description`, `author`, `date`) VALUES ('$title', '$cutdesc', '$fulldesc', '$author', NOW())")?1:0;
    6.         header("Location: /?added=$result");
    7.     }
    8.  
     
  3. klon5555

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

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Благодарю, это выглядит намного лучше:)
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    эа скейпить за вас Попов будет? =)
     
  5. AndreJM

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

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    За него это может сделать апачи например =) (ну если его конечно об этом попросить)
     
  6. asokol

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

    С нами с:
    17 янв 2012
    Сообщения:
    162
    Симпатии:
    0
    Тут не уменьшать надо, а увеличивать... Сперва, mysql_real_escape_string добавить (прочитав сначала, как использовать), потом выключить register_globals (почитав, что это такое) и переписать проверки переменных (-//-), сделать вывод текста ошибок, понятных посетителю (а не отписку: "Не удалось добавить запись"). А вот потом уже можно заняться и лаконичностью.

    P.S. на мой взгляд вот так.
    P.P.S. и еще: надо сделать так, чтобы запрос INSERT не возвращал ошибку, а после всех проверок добавлял данные.
     
  7. AndreJM

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

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Да, все верно, начинать надо действительно с BDD (Behavior Driven Development ). Тут я полностью Вас поддерживаю.

    ЗЫ: Речь просто о сценариях, Вы это умеет расписывать =)
     
  8. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Какого - то хрена, не дописалось мое сообщение, только заметил, не дописалось: Не забываем про экранирование.
     
  9. klon5555

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

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Насчет register_globals почитал, понял что это, и понял что это лучше отключить. Вообщем отключил:)
    Код (Text):
    1. //.htaccess
    2. php_flag register_globals off
    Насчет mysql_real_escape_string прочитал. Как я понимаю эта функция экранирует символы, но в коде символы выглядят как код символа. Если я не прав, поправьте меня:)

    Из этого всего следует что код наверное должен выглядеть так:

    Код (Text):
    1.  
    2. $title = mysql_real_escape_string($_POST['title']); // раньше было просто $_POST['title']
    3. $cutdesc = mysql_real_escape_string($_POST['cutdesc']); // раньше было просто $_POST['cutdesc']
    4. $fulldesc = mysql_real_escape_string($_POST['fulldesc']); // раньше было просто $_POST['fulldesc']
    5.  
    6. if(empty($title) || empty($cutdesc) || empty($fulldesc))
    7. {
    8.     header("Location: /?added=0");
    9. }else{
    10.         $result=mysql_query("INSERT INTO `news` (`title`, `cutdescription`, `description`, `author`, `date`) VALUES ('$title', '$cutdesc', '$fulldesc', '$author', NOW())")?1:0;
    11.         header("Location: /?added=$result");
    12.     }
    На целевой странице вот такие вот строчки получают данные и показывают результат:
    Код (Text):
    1. if($_GET['added']=='1'){echo '1';}
    2. if($_GET['added']=='0'){echo '0';}
    3. // else не использовал, т.к. вместо 1 может быть любая другая цифра/буква а важен именно 0 или 1
    И еще 1 вопрос. Конструкция вида:
    Код (Text):
    1. mysql_real_escape_string(substr(isset($_POST['title']) ? $_POST['title'] : '',0,32));
    будет нормально работать?

    P.S. как в новом варианте форума вставлять в код подсвечивание синтаксиса? Как например у Your во 2м сообщении данной темы.
     
  10. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Бред! :)
     
  11. klon5555

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

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    очень информативно))
     
  12. asokol

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

    С нами с:
    17 янв 2012
    Сообщения:
    162
    Симпатии:
    0
    1. Нет смысла делать mysql_real_escape_string на пустых строках. К тому же эту функцию лучше использовать либо прямо в запросе, либо до запроса (зависит от того, нужны ли переменные дальше по тексту или нет).
    2. Перед тем, как обращаться к переменной или индексу массива, - стоит убедиться, а определено ли оно.
    3. Насчет added = 1 | 0, можно еще так:
    Код (Text):
    1. if ($_GET['added'] == 0 || $_GET['added'] == 1) echo $_GET['added'];
    - все-таки, как насчет полноценного текста ошибки, которую допустил пользователь?
    4. Конструкция будет работать - см. пункт 1.
     
  13. AndreJM

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

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Код (PHP):
    1. if ( !($_GET['added'] >> 1) ) echo $_GET['added']; 
    Зы: если конечно без буквочек )
     
  14. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    А если захочется 10+ и т.д. будешь с этими кастылями только муздыкаться, туда, сюда, обратно.
    Проще тогда уже так написать:

    Код (PHP):
    1. if (intval($_GET['added'])>=0) echo $_GET['added'];  
     
  15. klon5555

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

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    1. Сделал запрос таким:
    Код (Text):
    1. INSERT INTO `news` (`title`, `cutdescription`, `description`, `author`, `date`) VALUES ('mysql_real_escape_string($_POST["title"])', 'mysql_real_escape_string($_POST["cutdesc"])', 'mysql_real_escape_string($_POST["fulldesc"])', '$author', NOW())
    Но не слишком ли он большой?))

    2. Определенно, всмысле:
    Код (Text):
    1. $i = 0;
    ? И что будет если этого не будет?

    3.Спасибо, совсем забыл про "и" :)
     
  16. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Ты еще больших не видел :))))), но посоветую тебе сделать одну функцию под экранирование, чтобы меньше писанины было.

    Тем пипец много, было бы каждая тема под, что - то одно и чтобы там все смотреть, а не как все подрят на создают и не смотрят есть нет она))
    И бывает, что не по теме вылетает))

    Ну вообщем вот ссылка viewtopic.php?f=13&t=5945&p=310629#p310629

    И еще если не создавать переменную до цикла сделать можно так:
    Код (PHP):
    1. for(;;)
    2. {
    3.     if($a > 10){break;}
    4.     echo $a;
    5.     $a++;
    6. } 
    Можно написать просто любую переменную и она начнется с 1
    Вывод: 12345678910

    Можно даже так:
    Код (PHP):
    1. ((empty($title) || empty($cutdesc) || empty($fulldesc)))?$result=0:mysql_query("INSERT INTO `news` (`title`, `cutdescription`, `description`, `author`, `date`) VALUES ('$title', '$cutdesc', '$fulldesc', '$author', NOW())")?$result=1:$result=0;
    2. header("Location: /?added=".$result);
    3.  
    Или так:
    Код (PHP):
    1. $result=((empty($title) || empty($cutdesc) || empty($fulldesc)))?0:mysql_query("INSERT INTO `news` (`title`, `cutdescription`, `description`, `author`, `date`) VALUES ('$title', '$cutdesc', '$fulldesc', '$author', NOW())")?1:0;
    2. header("Location: /?added=".$result);
    3.  

    :)))))))))))
     
  17. klon5555

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

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Спасибо:)
    То что нужно было) Функциональность сохранена, код уменьшен)
     
  18. asokol

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

    С нами с:
    17 янв 2012
    Сообщения:
    162
    Симпатии:
    0
    klon5555, мне кажется, что Your шутит и это тот случай, когда уменьшение кода сильно мешает читабельности. Но дело Ваше, в конце концов. Жаль, что потом приходится исправлять вот такие "уменьшения".
     
  19. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Вообще, чтобы было меньше кода и логичнее, нужно все делать от функций.
    Вызывать те конструкции которые тебе потребуются.

    Легче тем, что не нужно будет менять все на всех страницах, а лишь только поправить код в одном месте.
    И в дальнейшем делать это в одном месте.
    А вывод уже делать где угодно и как угодно.
     
  20. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    совершенству нет предела?
    Код (Text):
    1. ($title.$cutdesc.$fulldesc != '')