→

Говнокод →  Польский говнокод

if($rs===false){
        $rs='false';
}
elseif($rs=="dup"){
        $rs = "dup";
}
elseif($rs=="bad_link"){
        $rs = "bad_link";
}
else{
        $rs = 'true';
}
3

MySQL →  Как я фиксил баг в MySql

Эту историю можно было бы закинуть и в говнокод, но здесь не все очевидно и есть поучительные вещи.

Сотрудник сегодня скинул интересные запросы:

mysql> select * from db1.users t1 inner join db2.users t2 on t1.login=t2.username;

Empty set (1.61 sec)

mysql> select * from db1.users t1 where t1.login='igor';

1 row in set (0.11 sec)

mysql> select * from db2.users t2 where t2.username='igor';

1 row in set (0.03 sec)

Таблица t2 была создана до него, t1 создавал он сам.
В общем, он бил себя в грудь и орал, что нашел баг в мускуле. Я не верю ни в такие баги, ни в мистику (меня этому научили уже давно). Если вы видите такой «баг», то для начала найдите все баги у себя.

Не поверил я ему. Полез в эти базы, появился просто спортивный интерес:) Запускаю запросы, действительно отработали так, как он мне их сбросил. Я умышленно изменил таблицы и не показал результаты работы запросов, так вот, меня насторожило, что первый запрос выдал в результате поле login 'IGOR', а второй запрос — поле username 'igor'.

А он в качестве аргумента, что баг найден сделал так:
mysql> select if('IGOR'='igor',1,0);

+-----------------------+
| if('IGOR'='igor',1,0) |
+-----------------------+
| 1 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select if('IGOR'!='igor',1,0);

+------------------------+
| if('IGOR'!='igor',1,0) |
+------------------------+
| 0 |
+------------------------+
1 row in set (0.00 sec)

Сука, думаю, вот тебе и баг у мускула. Полез дальше в структуру таблиц, а там я вижу.

t1.login — сравнение стоит utf8_bin
t2.username — сравнение стоит utf8_general_ci

utf8_bin — хранит буковки 'G' и 'g' по-разному.
Поменял utf8_bin на utf8_general_ci и пофиксил баг у mysql:)
3

Говнокод →  От индусов

[1:42:08 PM] Sergio: сцуко писец, у индусов реально мозги в обратную сторону работают, нашел класс, написаный одним индусом, так у него в примере такая хрень:

for($i=$tot;$i>0;$i--)

обычные люди написали бы

for($i=1;$i<=$tot;$i++)

))
-2
7

Говнокод →  Генерация четырехзначного случайного числа

аааааааааааааааааааааа:)))))))))

$generation="".mt_rand(0,1000)."".mt_rand(0,1000)."".mt_rand(0,1000)."".mt_rand(0,1000)."";
0
8

Говнокод →  JS Функция для получения случайного цвета


<script language="Javascript">
<!--
function genHex(){
colors = new Array(14)
colors[0]="0"
colors[1]="1"
colors[2]="2"
colors[3]="3"
colors[4]="4"
colors[5]="5"
colors[5]="6"
colors[6]="7"
colors[7]="8"
colors[8]="9"
colors[9]="a"
colors[10]="b"
colors[11]="c"
colors[12]="d"
colors[13]="e"
colors[14]="f"

digit = new Array(5)
color=""
for (i=0;i<6;i++){
digit[i]=colors[Math.round(Math.random()*14)]
color = color+digit[i]
}
document.getElementById('hexc').style.backgroundCo lor=color
document.getElementById('hexn').innerText="#"+color
}
//-->
</script>
 


Нормальное решение здесь
0

PHP программирование →  Как работает rand?

Столкнулся с задачкой генерации логинов. Недолго думая была написана такая функция:


private function _get_login() {
       
        $login = "";                           
        for( $i=0; $i<=9; $i++ ) {

                $login .= chr( rand( 97, 122 ) );
        }
        return $login;
}
 


Которая по моему скромному мнению должна была генерировать уникальные логины, которые живому человеку придумать тяжело. Упор ставился именно на уникальность.
Если посчитать, количество таких логинов примерно 141167095653376. Логины генерировались и вставлялись в БД. Каково же было моё удивление когда после генерации примерно 1000 логинов посыпались ошибки добавления в базу при срабатывании констрейнтов не уникальности данных. Причем ошибки не единичные, а десятки логинов подряд вылетали. Начал исследовать — выяснилось эта функция действительно генерирует повторяющиеся логины=\. Как такое может быть, что бы последовательности из 10 случайных чисел совпадали так часто? Ответа на этот вопрос так и не нашел. Перешел на использование функции mt_rand(), которая работает в 4 раза быстрее обычной rand(), имеет какие-то известные гарантированные характеристики работы(в отличии от rand()) и добавил элементарную проверку.
Получилось так:


private function _get_login() {
       
       
        $done = false;
        while( !$done ) {
               
                $login = "";                           
                for( $i=0; $i<=9; $i++ ) {

                        $login .= chr( mt_rand( 97, 122 ) );
                }
                $sql = "SELECT count(*) FROM users WHERE login='$login'";
                if($this->db->fetchRow( $sql ) == 0)
                        $done = true;
        }
       
        return $login;
}
 


Может у вас будут идеи по усовершенствованию алгоритма генерации логинов что бы они удовлетворяли следующим условиям:
-более-менее удобочитаемы, а не что-то невнятное вида qlgkakxwci
-более-менее уникальные — что-то типа qlgkakxwci =)

Спасибо за внимание.
1
10

Говнокод →  Говнокод в Миранде

Вот такая вот реализация функции получения длины номерка UIN в Миранде.

\miranda\miranda\protocols\IcqOscarJ\icq_packet.c, line 206

int __fastcall getUINLen(DWORD dwUin)
{ // TODO: invent something more clever
  if (dwUin >= 1000000000) return 10;
  if (dwUin >= 100000000) return 9;
  if (dwUin >= 10000000) return 8;
  if (dwUin >= 1000000) return 7;
  if (dwUin >= 100000) return 6;
  if (dwUin >= 10000) return 5;
  if (dwUin >= 1000) return 4;
  if (dwUin >= 100) return 3;
  if (dwUin >= 10) return 2;
  return 1;
}


А как бы вы реализовали такую функцию?
2
4

Говнокод →  Китайский код самый беспощадный...

фанаты экранирования:)

// get today\'s date string as YYYY-MM-DD HH:MM:SS
 
   function getDateTime(){
       $datetime = getdate();
       $mday = $datetime[\'mday\'];
       if ($mday<10){
           $mday=\"0$mday\";
       }
       $mon = $datetime[\'mon\'];
       if ($mon<10){
           $mon=\"0$mon\";
       }
       $year = $datetime[\'year\'];
       $mhour = $datetime[\'hours\'];
       if ($mhour<10){
           $mhour=\"0$mhour\";
       }
0
1

Говнокод →  Начальник дал CMS типа их собственная разработка

… вот что я там увидел

if ($_name=='homepage' AND !is_numeric($_GET['id2']))
  include(SITEROOT."tpl/main.php");
 
else
  include(SITEROOT."tpl/main.php");
 
0
3

Говнокод →  Поиск уникального идентификатора для юзера в базу данных.


while(!$a){
      $rd = rand(1,999999);
      $mdrd = md5($rd);
      db_query("SELECT * FROM players WHERE mdid = '$mdrd' LIMIT 1;");
      $fla = db_fetch();
      if(empty($fla))
      $a=1;
}
 
0
2