Добрый день / вечер/ночь в задумках есть создание нескольких функций в классе для обработки Sql запросов ну чтото типа $this->select($schema,$table,$array(column),$where...); так вот в чем не задача - если пишут несколько разрабов - и ктото чего то пропустил ( кавычку или еше чегонить) по синтаксису SQL то ругаться будет на строчку в функции select а не на ту откуда этот селект был вызван, что жуутко напрягает т.к. не понятно в какой строчке ошибка. Кто как выходит из такой ситуации ?
Плиз не надо писать говно код((( с одним мне приходится время от времени работать((( Пиши либо полностью sql код как я, никто не поругает за это, удобно читать, либо бери готовый ORM на пр. Doctrine. Недавно полистал удобная вещь. Когда надерешься опыта привыкнешь к правильному коду пиши свой ORM.
Ой что то я сомниваюсь((( покажи Ты собираешься мучить людей заставлять их учить синтаксис твоего супер фреимворка? Если какой то крупный проект и разрабы имееют хотя бы каплю интелекта, то они не будут использовать твой код а возьмут готовый фреимворк где есть втроенный ORM или прикрутят отдельно ORM. Так что не напрягайся твой код кроме тебя никто использовать не будет. По поводу твоего вопроса: кстати как ты там через PDO или по старинке mysql_*? Если mysql_* а я в этом почти уверен, то вообще бросай писать ORM этим г***ом точно никто пользоваться не будет. Но все же, можешь я думаю поставить or die(mysql_error()), чем не вариант? Все равно же косяк в sql. Если PDO то try, catch
А вообще так не делай поторопился Не надо выводить на экран ошибку mysql в живой системе... выводи что то другое на пр. ругай программиста за кривые руки
во, только хотел поругать за такое решение Лучше написать "техническая ошибка, бла бла бла, администрация в курсе, ситуация под контролем, бла бла бла", а ошибку кинуть в лог.
Все в полном порядке, покрайней мере мои приложении в полной безопасности А вообще я хотел спасти мир от очередного мега навороченного ORM Если бы ты видел c чем мне приходится работать... по мере возможностей переписываю, а в новых проектах уже свое использую , но прошлый код это что то. Такие древние функции из PHP 4 используются ужас((( не удивляюсь почему прежнего программиста хакнули
Обсирать чужие проекты как я заметил вы умеете - а по существу я так и не заметил ответа а теперь вот в чем загвоздка 1. mysql как можно было заметить из 1 поста у меня не используется (переменная $schema)- но куда же вам .. мегапрограммерам. 2. Будете ли вы читать всю мою функцию только для того чтобы понять ее суть - не думаю но нате Код (Text): private function table($schema,$sTable,$sIndexColumn,array $aColumns ){ /** * Выводит в json */ if ( isset( $_GET['iDisplayStart'] ) && $_GET['iDisplayLength'] != '-1' ) { $sLimit = " LIMIT ".pg_escape_string( $_GET['iDisplayLength'] )." offset ". pg_escape_string( $_GET['iDisplayStart'] ); } $sOrder=""; if ( isset( $_GET['iSortCol_0'] ) ) { $sOrder = " ORDER BY "; for ( $i=0 ; $i<intval( $_GET['iSortingCols'] ) ; $i++ ) { if ( $_GET[ 'bSortable_'.intval($_GET['iSortCol_'.$i]) ] == "true" ) { $sOrder .= "\"".$aColumns[ intval( $_GET['iSortCol_'.$i] ) ]."\" ".pg_escape_string( $_GET['sSortDir_'.$i] ) .", "; } } $sOrder = substr_replace( $sOrder, "", -2 ); if ( $sOrder == " ORDER BY" ) { $sOrder = ""; } } $sWhere = ""; //$rResult=pg_query($pg_connect,'set datestyle to German;') or die("Query failed:kartoteka " . pg_last_error()); if ( isset ($_GET['sSearch']) ) { $sWhere = " WHERE ("; for ( $i=0 ; $i<count($aColumns) ; $i++ ) { $sWhere .= "\"$aColumns[$i]\" ILIKE '%".pg_escape_string( $_GET['sSearch'] )."%' OR "; } $sWhere = substr_replace( $sWhere, "", -3 ); $sWhere .= ')'; } /* Individual column filtering */ for ( $i=0 ; $i<count($aColumns) ; $i++ ) { if ( isset($_GET['bSearchable_'.$i]) && $_GET['bSearchable_'.$i] == "true" && $_GET['sSearch_'.$i] != '' ) { if ( $sWhere == "" ) { $sWhere = "WHERE "; } else { $sWhere .= " AND "; } $sWhere .= $aColumns[$i]." ILIKE '%".pg_escape_string($_GET['sSearch_'.$i])."%' "; } } /* * SQL queries * Get data to display */ $sQuery = "SELECT \"$sIndexColumn\", \"".str_replace(" , ", " ", implode("\", \"", $aColumns))."\" FROM \"$schema\".\"$sTable\" $sWhere $sOrder $sLimit; "; $rResult = pg_query($pg_connect,$sQuery) or die( pg_last_error()."<HR>".$sQuery ); /* Data set length after filtering */ $sQuery = "SELECT count(\"$sIndexColumn\") FROM \"$schema\".\"$sTable\" $sWhere"; $rResultFilterTotal = pg_query($pg_connect,$sQuery) or die( pg_last_error()."<HR>".$sQuery ); $aResultFilterTotal = pg_fetch_array ($rResultFilterTotal); $iFilteredTotal = $aResultFilterTotal[0]; /* Total data set length */ $sQuery = "SELECT count(\"$sIndexColumn\") FROM \"$schema\".\"$sTable\"" ; $rResultTotal = pg_query($pg_connect,$sQuery) or die( pg_last_error()."<HR>".$sQuery ); $aResultTotal = pg_fetch_array($rResultTotal); $iTotal = $aResultTotal[0]; if (!isset ($_GET['sEcho'])){$_GET['sEcho']="";} $json =''; $json .="{\"sEcho\":".intval($_GET['sEcho']).",\"iTotalRecords\":\"$iTotal\",\"iTotalDisplayRecords\":\"$iFilteredTotal\",\"aaData\":["; $rc = false; While ($row_tmp = pg_fetch_array($rResult) ) { if ($rc) $json .= ","; $json .= "{\"DT_RowId\":\"".$row_tmp[$sIndexColumn]."\""; for ( $i=0 ; $i<count($aColumns) ; $i++ ) { $json .= ",\"$i\":\"".addslashes($row_tmp[$aColumns[$i]])."\""; //$aColumns[$i]." ILIKE '%".pg_escape_string( $_GET['sSearch'] )."%' OR "; } $json .="}"; $rc = true; } $json .="]}"; echo $json; } как видно она делает тоже самое что я описал в первом посте просто более длинно. И так вопрос все еше остался - есть какоето нормальное решение указывающее с какой строки пришел вызов функции кроме использования __LINE__ и __FUNCTION__ ( которое требует постоянного указания данных констант). И поверьте Вам не суждено будет увидеть весь мой проект т.к. он внутренний и не смотряший в инет. Надеюсь на достойный ответ, а не мерянье у кого код длиннее
а в чем беда-то, я не понимаю ну надо будет взять запрос и понять где ошибка возникает. обычное дело. я держу список запросов всегда для этого в переменной, а в конце страницы смотрю из.
а проблема в том что разновидностей запросов ожидается более 1к .. при том что они еще и будут изменяться. сейчас выдается примерно такая ошибка Warning: pg_query(): Query failed: ОШИБКА: незавершённая строка в кавычках (примерное положение: "'10") LINE 1: DELETE FROM "schema"."table" WHERE "KODD"= '10 ^ in /var/www/xxx/xxx.php on line 157 ОШИБКА: незавершённая строка в кавычках (примерное положение: "'10") <HR>DELETE FROM "schema"."table" WHERE "KODD"= '10 опять же говорю это я беру пример - специально сгенерированный для уменьшения Вами читания. а вызов этой функции идет ну например на 657 строке и ошибка соответственно там, а не в строке 157.
ну я вообще не вижу способа бороться с таким если только не запоминать какой кусок запроса откуда пришел (по длинне строки тупо) но это капец уже
Единственное решение ( немного геморойное правда) которое я пока нашел вот такое Код (Text): function edit_doljn(){ $return=$this->sql(__FUNCTION__, __LINE__ ,"SELECT \"KODD\",\"NAME\" FROM \"schema\".\"table\" WHERE \n". "\"table\".\"KODD\" = " .$_REQUEST['id']); $i=0; $data = array(); While ($row_tmp = pg_fetch_array($return) ) { $data[$i]['id']=$row_tmp['KODD']; $data[$i]['NAME']=$row_tmp['NAME']; $i++; } echo $this->to_json ($data); } а именно в функцию пихать __LINE__ и __FUNCTION__ или __FILE__ .. надо будет подумать над этим а потом ошибки собирать в логе..
Мы не обсираем, а советуем. Ты как видно с малым опытом и поэтому такое накодишь мне например страшно даже представить.Поэтому посоветовал использовать готовый продукт, а когда привыкнешь к хорошему коду напишешь свой.Если напишешь очень хороший станешь всемирно известным человеком, все с тобой будут здороваться и фоткаться Мы не телепаты, иногда так обзовут, но поработаешь поймешь о чем я говорю.Ну да круто PostgreSQL и что то меняется теперь? Поддерживал бы php нормально try catch его бы предложил... А так не нужные костыли тебе придумывать я думаю(((
debug_backtrace выдает весь стек вызовов. соответственно, если ты вообще хочешь это автоматизировать, ты можешь поставить свой перехватчики ошибок и исключений. в случае если конечный класс это твоя оболочка над БД, логируй предыдущий уровень. ну или просто записывай весь стек, а не строку с сообщением.
То что надо ! спасибо огромное. Выдал и функцию откуда запустился запрос и строку .. и еще уйму чего. Сейчас разберу по полочкам и сделаю логирование ошибок.
Извини конечно но зачем тебе делать какое то дополнительное логирование? Ради того что бы показать программисту (самому себе) на какой строке ошибка? Или ты думаешь что твоим кодом будут пользоваться другие программисты? По моему это пустая трата времени. При разработке есть лог апача! Ну или что ты там используешь...
Ну собственно это именно так Он хочет вывести это сообщение т.е. залогировать и показать программисту т.е. самому себе
мда.. какие же вы не дальновидные ... показываю на пальцах когда пишется объемное приложение - возможно даже не 1 програмером .. а несколькими имеется такое понятие как человеческий фактор в базу вставляются / апдейтятся / удаляются данные из форм. а вдруг если ктото допустим даже я - на 1 из форм забуду поставить проверку на " а число ли вбито в поле" и пользователь херакнет текст и в интовый столбец полетит строка - что произойдет ?? правильно ошибка.. вот я ее уже и перехватил и себе в отдельную табличку "LOG" сохранил, а пользователю выдал сообщение об ошибке и телефоном куда звонить. а потом посмотрел вися на телефоне с пользователем чего я пропустил.
да, мы тупые, а ты дартаньян Добавлено спустя 1 минуту 5 секунд: ты серьёзно не понимаешь, что произойдет? не то, что ты описал =) совсем не то...
CREATE TABLE "public"."table" ( id serial NOT NULL, "int" integer, text character varying(255), currency numeric(10,2), CONSTRAINT "1" PRIMARY KEY (id) ) INSERT INTO "public"."table"( "int", text, currency) VALUES ( nsdv, 'Текст', 50); ----- ОШИБКА: колонка "nsdv" не существует LINE 3: VALUES ( nsdv, 'Текст', 50); ^ ********** Ошибка ********** ОШИБКА: колонка "nsdv" не существует SQL-состояние: 42703 Символ: 82 ----------------- INSERT INTO "public"."table"( "int", text, currency) VALUES ( 'nsdv', 'Текст', 50); ОШИБКА: неверное значение для целого числа: "nsdv" LINE 3: VALUES ( 'nsdv', 'Текст', 50); ^ ********** Ошибка ********** ОШИБКА: неверное значение для целого числа: "nsdv" SQL-состояние: 22P02 Символ: 82 поэтому я серьёзно не понимаю изучали ли вы postgresql или пишите только на MySql будем дальше придираться ? Кстати какое интересное отношение к новичкам на форуме - стараться опустить, показать что ты тут не нужен - теперь понятно почему на форуме 2..3 постоялых а остальные так.. пробегают видя хамство.