Это зависит не от нас, а от хостеров Неплохо было бы в каждую mysql-функцию вставлять $this->connecttdb
"Анархический чат" Без регистрации пользователей, какой либо модерации и.т.д. (всё хочу его переписать с нуля только грамотно, а времени нету)
Гы, а вы говорите что у РНР более читабельный код чем у PERL всё зависит только от того кто пишет... Вот функция хеширования написанная от нефиг делать... PHP: <?php function vld1_hash($s){for($s=strval($s),$n=0,$i=0;$i<strlen($s);$i++) {$n+=pow($i+ord($s[$i]),2);}for($a=0,$b=-1;$n>0;$a+=1/($b+=2)-1/($b+=2),$n--) {}$h=substr(sprintf('%1.40f',$a),-32,32);return $h;}?> И вторая версия PHP: <?php function vld2_hash($s){for($s=strval($s),$n=0,$i=0;$i<strlen($s);$n+=pow (ord($s[$i])+$i++,2)){}for($a=1,$b=1;$n>0;$a*=($b+1)/$b*(($b+1)/($b+=2)),$n--){ }for($h='',$t=sprintf('%1.40f',2*$a),$i=41;$i>9;$h.=$t[$i],$i--){}return $h;}?> Пользуйтесь пока я жив... Но как помру обратно верните (с) КВН Правда при хешировании строк длинной в 64 символа и больше они начинают нипадецки грузить сервак (проц), что в принципе даже хорошо т.к это накладывает ограничения и на скорость брут-форса...
Примитивный 3D рендер на PHP: PHP: <?php /* (C) Федотов Сергей 2006, [email=sergey89@gmail.com]sergey89@gmail.com[/email] */ define('START_TIME', microtime(true)); include 'matrix.php'; $width = 800; $height = 600; $img = imageCreateTrueColor($width, $height); /* Загружаем объект из файла */ $object = array(); $lines = file('test.obj'); foreach ($lines as $i => $poly) { $ver = explode(' ', trim($poly)); foreach ($ver as $j => $v) { $object[$i][$j] = intval($v); } } /* Производим трансформации над объектом */ $matrix = new Matrix(); for ($i = 0; $i < count($object); $i++) { $vec1 = $matrix->rotate($_GET['a'], $_GET['a'], $_GET['a'], array($object[$i][0], $object[$i][1], $object[$i][2])); $vec2 = $matrix->rotate($_GET['a'], $_GET['a'], $_GET['a'], array($object[$i][3], $object[$i][4], $object[$i][5])); $vec3 = $matrix->rotate($_GET['a'], $_GET['a'], $_GET['a'], array($object[$i][6], $object[$i][7], $object[$i][8])); $object[$i] = array($vec1[0], $vec1[1], $vec1[2], $vec2[0], $vec2[1], $vec2[2], $vec3[0], $vec3[1], $vec3[2]); } for ($i = 0; $i < count($object); $i++) { $vec1 = $matrix->scale(3, 3, 3, array($object[$i][0], $object[$i][1], $object[$i][2])); $vec2 = $matrix->scale(3, 3, 3, array($object[$i][3], $object[$i][4], $object[$i][5])); $vec3 = $matrix->scale(3, 3, 3, array($object[$i][6], $object[$i][7], $object[$i][8])); $object[$i] = array($vec1[0], $vec1[1], $vec1[2], $vec2[0], $vec2[1], $vec2[2], $vec3[0], $vec3[1], $vec3[2]); } /* Отсекаем нелицевые грани */ $pol = $object; $object = array(); for ($i = 0; $i < count($pol); $i++) { $poly = $pol[$i]; $a = array($poly[0], $poly[1], $poly[2]); $b = array($poly[3], $poly[4], $poly[5]); $c = array($poly[6], $poly[7], $poly[8]); $n = array( $a[1]*($b[2]-$c[2]) + $b[1]*($c[2]-$a[2]) + $c[1]*($a[2]-$b[2]), $a[2]*($b[0]-$c[0]) + $b[2]*($c[0]-$a[0]) + $c[2]*($a[0]-$b[0]), $a[0]*($b[1]-$c[1]) + $b[0]*($c[1]-$a[1]) + $c[0]*($a[1]-$b[1]) ); $l_n = sqrt($n[0]*$n[0] + $n[1]*$n[1] + $n[2]*$n[2]); if ($l_n == 0) $l_n = 1; $n = array($n[0]/$l_n, $n[1]/$l_n, $n[2]/$l_n); $l = array(0, 0, -1); $angle = acos(($n[0]*$l[0] + $n[1]*$l[1] + $n[2]*$l[2])/sqrt(($n[0]*$n[0] + $n[1]*$n[1] + $n[2]*$n[2]) + ($l[0]*$l[0] + $l[1]*$l[1] + $l[2]*$l[2]))); if (abs(rad2deg($angle)) < 90) { $object['poly'][] = $pol[$i]; $object['angle'][] = $angle; } } unset($pol); /* Сортируем грани по Z координате */ $z = array(); for ($i = 0; $i < count($object['poly']); $i++) { $z[$i] = min($object['poly'][$i][2], $object['poly'][$i][5], $object['poly'][$i][8]); } arsort($z); $pol = $object; $object = array(); foreach ($z as $key => $v) { $object['poly'][] = $pol['poly'][$key]; $object['angle'][] = $pol['angle'][$key]; } unset($pol); /* Преобразуем координаты +Y ______________+X | | | | -X ______|______ +X => | | | | | | | -Y +Y */ for ($i = 0; $i < count($object['poly']); $i++) { $object['poly'][$i][0] = ceil($width/2) - $object['poly'][$i][0]; $object['poly'][$i][3] = ceil($width/2) - $object['poly'][$i][3]; $object['poly'][$i][6] = ceil($width/2) - $object['poly'][$i][6]; $object['poly'][$i][1] = ceil($height/2) - $object['poly'][$i][1]; $object['poly'][$i][4] = ceil($height/2) - $object['poly'][$i][4]; $object['poly'][$i][7] = ceil($height/2) - $object['poly'][$i][7]; } /* Выводим объект на экран */ $tex = imageCreateFromJpeg('tex.jpg'); imageSetTile($img, $tex); imageFilledRectangle($img, 0, $height, $width, 0, IMG_COLOR_TILED); foreach ($object['poly'] as $key => $poly) { $color = imageColorAllocate($img, 255 - $object['angle'][$key]*2.5, 255 - $object['angle'][$key]*2.5, 255 - $object['angle'][$key]*2.5); imageFilledPolygon($img, array($poly[0], $poly[1], $poly[3], $poly[4], $poly[6], $poly[7]), 3, $color); } /* Выводим текст */ $fcolor = imageColorAllocate($img, 255, 255, 255); imageString($img, 3, 10, 10, 'Angle: '.$_GET['a'], $fcolor); imageString($img, 2, 10, 30, 'Triangles: '.count($object['poly']), $fcolor); //Заершающие действия... define('STOP_TIME', microtime(true)); imageString($img, 2, 10, 50, 'Time: '.sprintf('%.5f', (STOP_TIME - START_TIME)), $fcolor); header('Content-type: image/png'); imageJpeg($img, '', 80); ?> Класс для работы с матрицами http://www.mlib.com.ru/3d/matrix.txt Полигон - треугольник - 3 вершины - 9 кооринат. Пример объекта: http://www.mlib.com.ru/3d/test.obj
Вот и я написал свой класс для работы с MySQL, конечно на ракетную установку такой не поставишь, а вот для 99% веб-скриптов очень даже подойдёт... PHP: <?php Class Vladson_MySQL { var $link; function Vladson_MySQL() { if (!extension_loaded('mysql')) die('MySQL extension is not loaded.'); } function connect($host="localhost", $user="root", $pass="", $base="test") { return is_resource($this->link = @mysql_connect($host, $user, $pass)) ? @mysql_select_db($base) : $this->link; } function sql_query($sql, $is_array=false) { return is_resource($result = @mysql_unbuffered_query($sql)) ? $this->fetch($result, $is_array) : (false !== $result ? mysql_affected_rows() : $result); } function fetch($result, $is_array) { $array = array(); while ($temp = @mysql_fetch_assoc($result)) { $array[] = count($temp) > 1 ? $temp : current($temp); } return count($array) > 1 || $is_array ? $array : current($array); } function disconnect() { return @mysql_close($this->link); } } ?> Собственно всё что его отличает от других которые я видел что он возвращает данные в том виде в котором хочется, без танцев с бубном (только один танец "is_array" есть, но без него совсем никак) Трудно объяснить на словах подробности, думаю тут и так из кода видно что он и как делает... PHP: <?php header('Content-type: text/plain'); include 'vladson_mysql.php'; $mysql = & new Vladson_MySQL(); // ссоединяемся (BOOL) var_dump($mysql->connect()); // если запрос должен вернуть только одно значение (STRING) или один ряд (ARRAY) var_dump($mysql->sql_query("SELECT RAND();")); var_dump($mysql->sql_query("SELECT COUNT(*) FROM `files`;")); var_dump($mysql->sql_query("SELECT `name` FROM `files` WHERE `id` = 1;")); var_dump($mysql->sql_query("SELECT `id`,`name` FROM `files` WHERE `id` = 1;")); // если нужен список-массив (ARRAY) а не массив массивов с массивами var_dump($mysql->sql_query("SHOW DATABASES;", true)); var_dump($mysql->sql_query("SELECT `name` FROM `files`;", true)); // если нужен результат (INT) сколько было затронуто рядов при операции var_dump($mysql->sql_query("DELETE FROM `files` WHERE `id` > 99;")); var_dump($mysql->sql_query("UPDATE `files` SET `id` = 1 WHERE `id` = 3;")); // отссоединяемся (BOOL) var_dump($mysql->disconnect()); ?> ОЧЕНЬ БЫ ХОТЕЛОСЬ УСЛЫШАТЬ КРИТИКУ (только конструктивную, а не флуд)
в php разве не ссылочная передача объектов по дефолту? не видно приведи, что он выводит а так, я бы рекомендовал сделать 3 функции, возвращающие двумерный, одномерный и безмерный масив а не угадывать что там вернула одна единственная функция. sql зачем-то два раза повторяется...
Привычка с 4-го пыха, но это пример а не сам код который критиковать надо Если тебе надо "угадывать" то займись лучше не программированием а например боксом (именно для того чтоб не нужно было угадывать а можно было контролировать стоит параметр-флаг "is_array") Ты бы ещё придрался почему "BOOL" в коментариях большими буквами и почему не "boolean" Давайте по существу (баги, глюки, дыры, и.т.д.)
мдя... весь движок переписывать... Код (Text): foreach ($result as $row) echo $row['data']; этот код будет работать, если функция вернёт одну строку, а не две? просто не вижу смысла писать, что масло масляное. и, кстати, почему BOOL а не integer?
Вторая часть это только пример использования, её мы не критикуем !!! (в твоём скрипте может быть "$asdfg->sql_query()" и вообще хрен знает что) Естественно, если будет 0 результатов то не сработает, если больше то да (один больше чем ноль вроде)
Код (Text): $mysql->sql_query("SHOW DATABASES;", true) да.. непонятный параметр true - что может быть проще? лучше что-нибудь типа: Код (Text): $mysql->query_array("SHOW DATABASES;")
зачем ты собаками давишь все ошибки? сообщения очень помогают при дебаге. если смущают выкидыши в браузер - напиши свой обработчик ошибок, который будет отфильтровывать то, что в данный момент тебе не нужно. я сейчас юзаю такую простенькую штуку: Код (Text): function _errors () { static $err= array(); if (func_num_args()&&error_reporting()) { $e= func_get_args(); $e[]= debug_backtrace(); $err[]= $e; } return $err; }
а, ну в таком случае предлагаю пойти дальше: Код (Text): $mysql->sql_query(array(1,15), true) где 1 и 15 - номера лексем, которые нужно записать через пробел, составив тем самым запрос.
не, лучше так: Код (Text): $mysql->execfunc(1,array(1,15), true) , где первая единичка означает функцию делающую запрос.
Vladson dark-demon Да ладно вам. Какая разница, лишний метод или лишний параметр. Если бы Vladson сделал несколько методов, кто-нибудь обязательно прикопался бы к избыточному коду тяжела доля программиста. Vladson Класс неплох, но я сторонник немного другого подхода... по специальному методу на каждый тип запроса. Типа addLine, deleteLine, getLine, getLines... и так далее. И только для самых навороченных запросов - метод query, которому и передается весь текст запроса. Если уж делать абстракцию от низкоуровневых функций - так делать нормально
Смысл кода не в абстракции, совсем наоборот ! Смысл в том чтоб предоставить одну единственную функцию для посыла в неё запроса и возвращения сразу результата, без доп-танцев с бубном !!! Опять же задаю повторыный вопрос, кто нибудь видит реальные (а не моральные "типа я не сторонник итд") причины почему этот класс нельзя использовать в реальных приложениях ? (глюки, баги, нарушение сетевого этикета, нарушение чьих то религиозных убеждений, и.т.д.)
почему это должна быть именно одна функция? не логичнее ли для возвращения данных в иной форме использовать иную функцию? можно, разрешаю
парсинг 4-8 строк - это самое узкое место в системе? тогда пиши всё в одну строку... если да, то стоит задуматься, а оправдан ли выбор именно языка php....