Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [php] Krótka funkcja ułatwiająca korzystanie z zapytań do bazy danych
Kildyt
post
Post #1





Grupa: Zarejestrowani
Postów: 869
Pomógł: 53
Dołączył: 20.10.2003
Skąd: Przeworsk

Ostrzeżenie: (0%)
-----


Witajcie!

Piszę aktualnie nową wersję redbooka i pomyślałem, że niektórym powinna ułatwić życie krótka funkcja, która generuje ciąg do zapytań do bazy danych.
Przy okazji proszę o ocenę.

Oto kod:
  1. <?php
  2. function pull($item, $method = NULL) { // Generowanie ciągu do zapytania mysql
  3.    $return = NULL;
  4.    
  5.    /*
  6.     OJAŚNIENIE SYTUACJI
  7.     1 - Została podana jedynie nazwa elementu
  8.         Przykład: array('imie', 'nazwisko')
  9.     2 - Została podana tablica zawierająca nazwę elementu i jej wartość, która nie jest obiektem
  10.         Przykład: array(
  11.                                         array('imie', 'Jan'),
  12.                                         array('imie', $autor),
  13.                                         array('imie', $_POST['autor'])
  14.                                     )
  15.     3 - Została podana tablica zawierająca nazwę elementu i jej wartość, która jest tablicą i przyjmuje wartość nazwy elementu
  16.         Przykład: array(
  17.                                         array('imie', $_POST),
  18.                                         array('imie', $_GET)
  19.                                     )
  20.     */
  21.    
  22.    if (empty($method)) {
  23.        $method = $_POST;
  24.    }
  25.    
  26.    for ($i = 0, $to = count($item)-1; $i <= $to; $i++) {
  27.        if (is_array($item[$i])) {
  28.            if (is_array($item[$i][1])) {
  29.                // Sytuacja 3
  30.                $return .= '`'.$item[$i].'` = ''.$item[$i][1][$item[$i][0]].'', ';
  31.            } else {
  32.                // Sytuacja 2
  33.                $return .= '`'.$item[$i][0].'` = ''.$item[$i][1].'', ';
  34.            }
  35.        } else {
  36.            // Sytuacja 1
  37.            $return .= '`'.$item[$i].'` = ''.$method[$item[$i]].'', ';
  38.        }
  39.    }
  40.    
  41.    return substr($return, 0, -2);
  42. }
  43. ?>


I stąd zamiast:
  1. <?php
  2. mysql_query("INSERT INTO `name` SET `imie`='$_POST[imie]', `nazwisko`='$_POST[nazwisko]', `gg`='$_POST[gg]', `jabber`='$_POST[jabber]', `email`='$_POST[email]'");
  3. ?>
Mamy:
  1. <?php
  2. mysql_query("INSERT INTO `name` SET ".pull(array('imie', 'nazwisko', 'gg', 'jabber', 'email')));
  3. ?>


Funkcja napisana w kilkanaście minut. Licencja GPL v3.
Może się to wielu wydawać dziwne, że tak prosty kod daję do oceny i publikuję na GPL-u, ale chciałbym dać chociaż mały znak, że wspieram open source! (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował Kildyt 2.03.2009, 18:08:33
Go to the top of the page
+Quote Post
.radex
post
Post #2





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

Ostrzeżenie: (0%)
-----


  1. <?php
  2. for ($i = 0, $to = count($item)-1; $i <= $to; $i++) {
  3. ?>


nie łatwiej

  1. <?php
  2. for ($i = 0, $to = count($item); $i < $to; $i++) {
  3. ?>


?

  1. <?php
  2. @$item[$i][1][$item[$i][0]]
  3. ?>


po co "@" ? I tak nie rozwiązujesz tym żadnego problemu. Po prostu maskujesz błędy (teoretycznie mogłoby wywalić notice) w tej sytuacji

Ogólnie fajna funkcyjka, zapewne przydatna, ale nie lepiej dla użytkownika (w sensie programisty) zrobić:

  1. <?php
  2. pull('imie', 'nazwisko', 'gg', 'jabber', 'email')
  3. ?>


zamiast

  1. <?php
  2. pull(array('imie', 'nazwisko', 'gg', 'jabber', 'email'))
  3. ?>


hm? Żadna filozofia a umila pracę
Go to the top of the page
+Quote Post
Kildyt
post
Post #3





Grupa: Zarejestrowani
Postów: 869
Pomógł: 53
Dołączył: 20.10.2003
Skąd: Przeworsk

Ostrzeżenie: (0%)
-----


Używam w nowym CMS-ie: error_reporting(E_ALL), więc dlatego unikam notic-ów.
Go to the top of the page
+Quote Post
mike
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


Cytat(Kildyt @ 2.03.2009, 15:29:50 ) *
Używam w nowym CMS-ie: error_reporting(E_ALL), więc dlatego unikam notic-ów.
Proponuję wejść na przejście dla pieszych na czerwonym świetle. Jak zamkniesz oczy to unikniesz zderzenia.
Go to the top of the page
+Quote Post
bim2
post
Post #5





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


count() wydziel do zmiennej i na niej iteruj...

Pomysłwowości ci pogratuluje, ale funkcja taka sobie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Juz lepiej funkcje insert dać, albo najlepiej całą klasę ;d
Go to the top of the page
+Quote Post
mike
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


Cytat(bim2 @ 2.03.2009, 16:35:53 ) *
count() wydziel do zmiennej i na niej iteruj..
Przecież ma wydzielone (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Ten post edytował mike 2.03.2009, 16:39:34
Go to the top of the page
+Quote Post
Kildyt
post
Post #7





Grupa: Zarejestrowani
Postów: 869
Pomógł: 53
Dołączył: 20.10.2003
Skąd: Przeworsk

Ostrzeżenie: (0%)
-----


Cytat(.radex @ 2.03.2009, 17:21:07 ) *
po co "@" ? I tak nie rozwiązujesz tym żadnego problemu. Po prostu maskujesz błędy (teoretycznie mogłoby wywalić notice) w tej sytuacji
Macie rację. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Błędy ukryłem na wczesnym etapie pracy, kiedy funkcja była wywoływana cały czas, a nie wtedy kiedy powinna. Po kilkunastu minutach zrozumiałem błąd. Kod zmieniam. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Cytat(.radex @ 2.03.2009, 17:21:07 ) *
Ogólnie fajna funkcyjka, zapewne przydatna, ale nie lepiej dla użytkownika (w sensie programisty) zrobić:

  1. <?php
  2. pull('imie', 'nazwisko', 'gg', 'jabber', 'email')
  3. ?>


zamiast

  1. <?php
  2. pull(array('imie', 'nazwisko', 'gg', 'jabber', 'email'))
  3. ?>


hm? Żadna filozofia a umila pracę

Do funkcji nie jest dostarczana tylko jedna wartość. Rozbudowałem ją sobie jeszcze o wyjątki i usunięcia, ale to już pod mój cms.

Dzięki za opinie. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
.radex
post
Post #8





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

Ostrzeżenie: (0%)
-----


Cytat(Kildyt @ 2.03.2009, 18:07:53 ) *
Do funkcji nie jest dostarczana tylko jedna wartość.


... a func_get_args() znasz ?
Go to the top of the page
+Quote Post
bim2
post
Post #9





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


@mike
Tak jest jak patrzy się na for( i count() ;d;d Ehh...

Zrób od razu może filtracje zmiennych
Go to the top of the page
+Quote Post
erix
post
Post #10





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




A czemu nie zrobisz funkcji w stylu:
  1. <?php
  2. pull(
  3.  array('col'=>'val', 'col2'=>'val'),
  4.  'tabela'
  5. );
  6. ?>

?
Go to the top of the page
+Quote Post
Crozin
post
Post #11





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Jak będę miał jakąś wartość numeryczną to efektem będzie
  1. col = 'val'
czy
  1. col=val
? Jak dam null to będzie
  1. col = 'null'
czy
  1. col=NULL
?

Rozumiem, że funkcja przydaje się jedynie do zastosowanie z INSERT INTO, w dodatku w przypadku składni z SET?
Go to the top of the page
+Quote Post
Kildyt
post
Post #12





Grupa: Zarejestrowani
Postów: 869
Pomógł: 53
Dołączył: 20.10.2003
Skąd: Przeworsk

Ostrzeżenie: (0%)
-----


Wartość zawsze będzie w apostrofach.
Zastosowanie funkcji nie ogranicza się jedynie do SET-a.
Go to the top of the page
+Quote Post
nospor
post
Post #13





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Wartość zawsze będzie w apostrofach.
ale zdajesz sobie sprawę, ze często gęsto chcemy wstawic wartosc NULL a nie tekst 'NULL'?



Cytat
Zastosowanie funkcji nie ogranicza się jedynie do SET-a.
Przy obecnym zapisie to raczej tylko. Czyli INSERT i UPDATE
Go to the top of the page
+Quote Post
phpion
post
Post #14





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(Kildyt @ 2.03.2009, 16:38:03 ) *
Może się to wielu wydawać dziwne, że tak prosty kod daję do oceny i publikuję na GPL-u, ale chciałbym dać chociaż mały znak, że wspieram open source! (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Tekst (jak i sama funkcja) słaby. Poprzednicy wspomnieli już o jej ograniczeniach. Ja dodam ze swojej strony kolejne ograniczenie: tylko MySQL. Ogólnie nie sądzę aby ktokolwiek jej używał; jeśli ktoś będzie potrzebował czegoś podobnego to bez problemu sam sobie napisze.
Go to the top of the page
+Quote Post
Kildyt
post
Post #15





Grupa: Zarejestrowani
Postów: 869
Pomógł: 53
Dołączył: 20.10.2003
Skąd: Przeworsk

Ostrzeżenie: (0%)
-----


Trochę poprawiłem. Apostrofy nie są obowiązkowe.

  1. <?php
  2.  
  3. function pull($item, $method = NULL) { // Generowanie ciągu do zapytania mysql
  4.   $return = NULL;
  5.  
  6.   /*
  7.    OJAŚNIENIE SYTUACJI
  8.    1 - Została podana jedynie nazwa elementu
  9.        Przykład: array('imie', 'nazwisko')
  10.    2 - Została podana tablica zawierająca nazwę elementu i jej wartość, która nie jest obiektem
  11.        Przykład: array(
  12.                                   array('imie', 'Jan'),
  13.                                   array('imie', $autor),
  14.                                   array('imie', $_POST['autor'])
  15.                               )
  16.    3 - Została podana tablica zawierająca nazwę elementu i jej wartość, która jest tablicą i przyjmuje wartość nazwy elementu
  17.        Przykład: array(
  18.                                  array('imie', $_POST),
  19.                                  array('imie', $_GET)
  20.                              )
  21.    PRZYPISY
  22.    #1 - Dodawanie apostrofów
  23.        Przykład zastosowania: array(
  24.                                array('wiek', 2+1), // Rezultat: `imie` = 3
  25.                                 array('int', '`id`+5', 1) // Rezultat `imie` = `id`+5
  26.                                                           )
  27.    */
  28.  
  29.   if (empty($method)) $method = $_POST;
  30.  
  31.   for ($i = 0, $to = count($item); $i < $to; $i++) {
  32.      $slash[$i] = NULL;
  33.      
  34.       if (is_array($item[$i])) {
  35.           if (is_string($item[$i][1]) AND !isset($item[$i][2])) $slash[$i] = '''; #1
  36.          
  37.           if (is_array($item[$i][1])) {
  38.               // Sytuacja 3
  39.               $return .= '`'.$item[$i].'` = '.$slash[$i].$item[$i][1][$item[$i][0]].$slash[$i].', ';
  40.           } else {
  41.               // Sytuacja 2
  42.               $return .= '`'.$item[$i][0].'` = '.$slash[$i].$item[$i][1].$slash[$i].', ';
  43.           }
  44.       } else {
  45.           // Sytuacja 1
  46.           $return .= '`'.$item[$i].'` = ''.$method[$item[$i]].'', ';
  47.       }
  48.   }
  49.  
  50.   return substr($return, 0, -2);
  51. }
  52.  
  53. ?>


Ten post edytował Kildyt 4.03.2009, 13:19:08
Go to the top of the page
+Quote Post
Crozin
post
Post #16





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


A co jak będę chciał np. zrobić UPDATEa:
  1. UPDATE abc SET sthCount = sthCount + 1, sthElse = 'abcdef';
Znowu polegnie.
Go to the top of the page
+Quote Post
Kildyt
post
Post #17





Grupa: Zarejestrowani
Postów: 869
Pomógł: 53
Dołączył: 20.10.2003
Skąd: Przeworsk

Ostrzeżenie: (0%)
-----


Cytat(Crozin @ 4.03.2009, 16:36:57 ) *
A co jak będę chciał np. zrobić UPDATEa:
  1. UPDATE abc SET sthCount = sthCount + 1, sthElse = 'abcdef';
Znowu polegnie.


  1. <?php
  2. mysql_query('UPDATE `abc` SET '.pull(array(
  3.                                              array('sthCount', '`sthCount` + 1', 1),
  4.                                              array('sthElse', 'abcdef')
  5.                                             )));
  6. ?>
Rezultat dla funkcji to:
  1. <?php
  2. `sthCount` = `sthCount` + 1, `sthElse` = 'abcdef'
  3. ?>


Ten post edytował Kildyt 4.03.2009, 15:01:19
Go to the top of the page
+Quote Post
sowiq
post
Post #18





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat
array('sthCount', '`sthCount + 1', 1),
Taki mały, nadzorowany SQL Injection? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Nie obraź się, ale podzielam zdanie ~phpion'a.
Go to the top of the page
+Quote Post
Kildyt
post
Post #19





Grupa: Zarejestrowani
Postów: 869
Pomógł: 53
Dołączył: 20.10.2003
Skąd: Przeworsk

Ostrzeżenie: (0%)
-----


Cytat(sowiq @ 4.03.2009, 17:03:19 ) *
Taki mały, nadzorowany SQL Injection? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Nie obraź się, ale podzielam zdanie ~phpion'a.
Jeżeli chodzi o ` to post zeedytowałem prawie od razu. Musiałeś zobaczyć go przed edycją.
Przecież ja nie mam na co się obrażać. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Chodziło mi o napisanie prostej funkcji i wiem, że mi się to udało.

Co do filtracji zmiennych to nie napisałem ją w tej funkcji, ponieważ w nowym redbook'u od razu filtruję $_POST i $_GET.

Ten post edytował Kildyt 4.03.2009, 15:18:01
Go to the top of the page
+Quote Post
Crozin
post
Post #20





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Z góry zaśmiecasz wszystkie zmienne z $_POST, $_GET mysql_real_escape_stringiem?
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 2.10.2025 - 04:49