За последние 24 часа нас посетили 38982 программиста и 1284 робота. Сейчас ищут 1011 программистов ...

классы и база данных

Тема в разделе "PHP и базы данных", создана пользователем Slavka, 5 окт 2013.

  1. Slavka

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

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    Добрый день / вечер/ночь в задумках есть создание нескольких функций в классе для обработки Sql запросов ну чтото типа

    $this->select($schema,$table,$array(column),$where...);
    так вот в чем не задача - если пишут несколько разрабов - и ктото чего то пропустил ( кавычку или еше чегонить) по синтаксису SQL то ругаться будет на строчку в функции select а не на ту откуда этот селект был вызван, что жуутко напрягает т.к. не понятно в какой строчке ошибка.

    Кто как выходит из такой ситуации ?
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Плиз не надо писать говно код((( с одним мне приходится время от времени работать(((
    Пиши либо полностью sql код как я, никто не поругает за это, удобно читать, либо бери готовый ORM на пр. Doctrine.
    Недавно полистал удобная вещь.
    Когда надерешься опыта привыкнешь к правильному коду пиши свой ORM.
     
  3. Slavka

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

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    я условно написал - реально использую другую конструкцию но сути вопроса не меняет
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Ой что то я сомниваюсь((( покажи:)

    Ты собираешься мучить людей заставлять их учить синтаксис твоего супер фреимворка?
    Если какой то крупный проект и разрабы имееют хотя бы каплю интелекта, то они не будут использовать твой код а возьмут готовый фреимворк где есть втроенный ORM или прикрутят отдельно ORM. Так что не напрягайся твой код кроме тебя никто использовать не будет.

    По поводу твоего вопроса:
    кстати как ты там через PDO или по старинке mysql_*?
    Если mysql_* а я в этом почти уверен, то вообще бросай писать ORM этим г***ом точно никто пользоваться не будет.
    Но все же, можешь я думаю поставить or die(mysql_error()), чем не вариант? Все равно же косяк в sql.
    Если PDO то try, catch
     
  5. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    А вообще так не делай поторопился :) Не надо выводить на экран ошибку mysql в живой системе... выводи что то другое на пр. ругай программиста за кривые руки:)
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    во, только хотел поругать за такое решение :) Лучше написать "техническая ошибка, бла бла бла, администрация в курсе, ситуация под контролем, бла бла бла", а ошибку кинуть в лог.
     
  7. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Все в полном порядке, покрайней мере мои приложении в полной безопасности:)

    А вообще я хотел спасти мир от очередного мега навороченного ORM :)
    Если бы ты видел c чем мне приходится работать... по мере возможностей переписываю, а в новых проектах уже свое использую , но прошлый код это что то. Такие древние функции из PHP 4 используются ужас((( не удивляюсь почему прежнего программиста хакнули :)
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Учитывая, что я, например, вообще не одобряю такое явление как ORM в вебе, я тебя понимаю.
    [​IMG]
     
  9. Slavka

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

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    Обсирать чужие проекты как я заметил вы умеете - а по существу я так и не заметил ответа
    а теперь вот в чем загвоздка
    1. mysql как можно было заметить из 1 поста у меня не используется (переменная $schema)- но куда же вам .. мегапрограммерам.
    2. Будете ли вы читать всю мою функцию только для того чтобы понять ее суть - не думаю но нате
    Код (Text):
    1.     private function table($schema,$sTable,$sIndexColumn,array $aColumns ){
    2. /**
    3.  
    4.  * Выводит в json
    5.  
    6.  */
    7.        
    8.         if ( isset( $_GET['iDisplayStart'] ) && $_GET['iDisplayLength'] != '-1' )
    9.            {
    10.               $sLimit = " LIMIT ".pg_escape_string( $_GET['iDisplayLength'] )." offset ".
    11.               pg_escape_string( $_GET['iDisplayStart'] );
    12.            }
    13.         $sOrder="";
    14.         if ( isset( $_GET['iSortCol_0'] ) )
    15.            {
    16.               $sOrder = " ORDER BY  ";
    17.               for ( $i=0 ; $i<intval( $_GET['iSortingCols'] ) ; $i++ )
    18.                   {
    19.                   if ( $_GET[ 'bSortable_'.intval($_GET['iSortCol_'.$i]) ] == "true" )
    20.                      {
    21.                         $sOrder .= "\"".$aColumns[ intval( $_GET['iSortCol_'.$i] ) ]."\"
    22.                           ".pg_escape_string( $_GET['sSortDir_'.$i] ) .", ";
    23.                      }
    24.                   }
    25.               $sOrder = substr_replace( $sOrder, "", -2 );
    26.               if ( $sOrder == " ORDER BY" )
    27.                   {
    28.                      $sOrder = "";
    29.                   }
    30.            }
    31.             $sWhere = "";
    32.             //$rResult=pg_query($pg_connect,'set datestyle to German;') or die("Query failed:kartoteka " . pg_last_error());
    33.  
    34.  
    35.         if ( isset ($_GET['sSearch']) )
    36.         {
    37.             $sWhere = " WHERE (";
    38.             for ( $i=0 ; $i<count($aColumns) ; $i++ )
    39.             {
    40.                 $sWhere .= "\"$aColumns[$i]\" ILIKE '%".pg_escape_string( $_GET['sSearch'] )."%' OR ";
    41.             }
    42.             $sWhere = substr_replace( $sWhere, "", -3 );
    43.             $sWhere .= ')';
    44.         }
    45.  
    46.     /* Individual column filtering */
    47.        for ( $i=0 ; $i<count($aColumns) ; $i++ )
    48.        {
    49.         if ( isset($_GET['bSearchable_'.$i]) && $_GET['bSearchable_'.$i] == "true" && $_GET['sSearch_'.$i] != '' )
    50.         {
    51.             if ( $sWhere == "" )
    52.             {
    53.                 $sWhere = "WHERE ";
    54.             }
    55.             else
    56.             {
    57.                 $sWhere .= " AND ";
    58.             }
    59.             $sWhere .= $aColumns[$i]." ILIKE '%".pg_escape_string($_GET['sSearch_'.$i])."%' ";
    60.         }
    61.     }
    62.  
    63.  
    64.     /*
    65.      * SQL queries
    66.      * Get data to display
    67.      */
    68.      
    69.      $sQuery = "SELECT \"$sIndexColumn\", \"".str_replace(" , ", " ", implode("\", \"", $aColumns))."\"
    70.      FROM  \"$schema\".\"$sTable\"
    71.         $sWhere
    72.         $sOrder
    73.         $sLimit;
    74.     ";
    75.    
    76.         $rResult = pg_query($pg_connect,$sQuery) or die( pg_last_error()."<HR>".$sQuery  );    
    77.      
    78.     /* Data set length after filtering */
    79.     $sQuery = "SELECT count(\"$sIndexColumn\")  FROM \"$schema\".\"$sTable\" $sWhere";
    80.     $rResultFilterTotal = pg_query($pg_connect,$sQuery) or die( pg_last_error()."<HR>".$sQuery  );  
    81.     $aResultFilterTotal = pg_fetch_array ($rResultFilterTotal);
    82.     $iFilteredTotal = $aResultFilterTotal[0];
    83.  
    84.     /* Total data set length */
    85.     $sQuery = "SELECT count(\"$sIndexColumn\")  FROM \"$schema\".\"$sTable\"" ;
    86.    
    87.     $rResultTotal = pg_query($pg_connect,$sQuery) or die( pg_last_error()."<HR>".$sQuery  );  
    88.     $aResultTotal = pg_fetch_array($rResultTotal);
    89.     $iTotal = $aResultTotal[0];
    90.  
    91.  
    92. if (!isset ($_GET['sEcho'])){$_GET['sEcho']="";}
    93.    $json ='';
    94.    $json .="{\"sEcho\":".intval($_GET['sEcho']).",\"iTotalRecords\":\"$iTotal\",\"iTotalDisplayRecords\":\"$iFilteredTotal\",\"aaData\":[";
    95.    $rc = false;
    96.  
    97. While ($row_tmp = pg_fetch_array($rResult) ) {
    98.  
    99.     if ($rc) $json .= ",";
    100.    
    101.     $json .= "{\"DT_RowId\":\"".$row_tmp[$sIndexColumn]."\"";
    102.    
    103.     for ( $i=0 ; $i<count($aColumns) ; $i++ )
    104.             {
    105.                 $json .= ",\"$i\":\"".addslashes($row_tmp[$aColumns[$i]])."\"";    //$aColumns[$i]." ILIKE '%".pg_escape_string( $_GET['sSearch'] )."%' OR ";
    106.             }
    107.      $json .="}";
    108.      $rc = true;        
    109.  
    110.  
    111. }
    112.   $json .="]}";
    113.  
    114. echo $json;
    115.      
    116.        
    117.     }
    как видно она делает тоже самое что я описал в первом посте просто более длинно.

    И так вопрос все еше остался - есть какоето нормальное решение указывающее с какой строки пришел вызов функции кроме использования __LINE__ и __FUNCTION__ ( которое требует постоянного указания данных констант).
    И поверьте Вам не суждено будет увидеть весь мой проект т.к. он внутренний и не смотряший в инет.
    Надеюсь на достойный ответ, а не мерянье у кого код длиннее
     
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а в чем беда-то, я не понимаю

    ну надо будет взять запрос и понять где ошибка возникает. обычное дело. я держу список запросов всегда для этого в переменной, а в конце страницы смотрю из.
     
  11. Slavka

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

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    а проблема в том что разновидностей запросов ожидается более 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.
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну я вообще не вижу способа бороться с таким

    если только не запоминать какой кусок запроса откуда пришел (по длинне строки тупо) но это капец уже
     
  13. Slavka

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

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    Единственное решение ( немного геморойное правда) которое я пока нашел вот такое
    Код (Text):
    1.  
    2. function edit_doljn(){
    3. $return=$this->sql(__FUNCTION__, __LINE__ ,"SELECT \"KODD\",\"NAME\" FROM \"schema\".\"table\" WHERE \n".
    4. "\"table\".\"KODD\" = " .$_REQUEST['id']);
    5.    
    6.  $i=0;
    7.  
    8.  $data = array();
    9. While ($row_tmp = pg_fetch_array($return) ) {
    10.  
    11.     $data[$i]['id']=$row_tmp['KODD'];
    12.     $data[$i]['NAME']=$row_tmp['NAME'];
    13.    
    14.  
    15. $i++;
    16. }
    17. echo $this->to_json ($data);  
    18. }
    а именно в функцию пихать __LINE__ и __FUNCTION__ или __FILE__ .. надо будет подумать над этим

    а потом ошибки собирать в логе..
     
  14. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Мы не обсираем, а советуем. Ты как видно с малым опытом и поэтому такое накодишь мне например страшно даже представить.Поэтому посоветовал использовать готовый продукт, а когда привыкнешь к хорошему коду напишешь свой.Если напишешь очень хороший станешь всемирно известным человеком, все с тобой будут здороваться и фоткаться :)

    Мы не телепаты, иногда так обзовут, но поработаешь поймешь о чем я говорю.Ну да круто PostgreSQL и что то меняется теперь? :)

    Поддерживал бы php нормально try catch его бы предложил... А так не нужные костыли тебе придумывать я думаю(((
     
  15. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    debug_backtrace выдает весь стек вызовов. соответственно, если ты вообще хочешь это автоматизировать, ты можешь поставить свой перехватчики ошибок и исключений. в случае если конечный класс это твоя оболочка над БД, логируй предыдущий уровень.
    ну или просто записывай весь стек, а не строку с сообщением.
     
  16. Slavka

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

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    То что надо ! спасибо огромное. Выдал и функцию откуда запустился запрос и строку .. и еще уйму чего.
    Сейчас разберу по полочкам и сделаю логирование ошибок.
     
  17. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Извини конечно но зачем тебе делать какое то дополнительное логирование?
    Ради того что бы показать программисту (самому себе) на какой строке ошибка? Или ты думаешь что твоим кодом будут пользоваться другие программисты?
    По моему это пустая трата времени. При разработке есть лог апача! Ну или что ты там используешь...
     
  18. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Аа, а я не понял. я думал он хочет понять где косяк в запросе... я не телепат.
     
  19. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Ну собственно это именно так:)
    Он хочет вывести это сообщение т.е. залогировать и показать программисту т.е. самому себе:)
     
  20. Slavka

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

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    мда.. какие же вы не дальновидные ... показываю на пальцах

    когда пишется объемное приложение - возможно даже не 1 програмером .. а несколькими имеется такое понятие как человеческий фактор
    в базу вставляются / апдейтятся / удаляются данные из форм.

    а вдруг если ктото допустим даже я - на 1 из форм забуду поставить проверку на " а число ли вбито в поле" и пользователь херакнет текст и в интовый столбец полетит строка - что произойдет ?? правильно ошибка.. вот я ее уже и перехватил и себе в отдельную табличку "LOG" сохранил, а пользователю выдал сообщение об ошибке и телефоном куда звонить. а потом посмотрел вися на телефоне с пользователем чего я пропустил.
     
  21. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Спорить не вижу смысла поэтому удачи.
     
  22. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    БД присвоит столбцу нулевое значение и успешно выполнит запрос. Ну по крайней мере MySQL точно.
     
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    да, мы тупые, а ты дартаньян

    Добавлено спустя 1 минуту 5 секунд:
    ты серьёзно не понимаешь, что произойдет? не то, что ты описал =) совсем не то...
     
  24. Slavka

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

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    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 постоялых а остальные так.. пробегают видя хамство.
     
  25. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты какой-то нервный. никто к тебе не придирается. удачи.