Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tablice
Forum PHP.pl > Forum > Przedszkole
Krzychur
Witam!
Właśnie napisałem swoją, narazie jeszcze prostą klasę obsługi bazy danych. Poniżej załączam urywek funkcji dodającej rekord to tablicy:
  1. <?php
  2. public function insert($table, $values, &$reference = '') {
  3. $this -> queries++;
  4.  
  5. foreach ($values as $field => $value) {
  6. if (!isset($comma)) {
  7. $array = array('fields' => '`'.$field.'`','values' => '''.$value.''');
  8. $comma = '';
  9. }
  10. else {
  11. $array['fields'] .= ', `'.$field.'`';
  12. $array['values'] .= ', ''.$value.''';
  13. }
  14. }
  15. $query = 'INSERT INTO `'.$this -> prefix.$table.'` ('.$array['fields'].') VALUES ('.$array['values'].')';
  16.  
  17. switch ($this -> db_type) {
  18.  
  19. // ... MySQL database
  20. case 'mysql':
  21. if (@mysql_db_query($this -> db_name,$query,$this -> link_id)) {
  22. $reference = mysql_insert_id();
  23. return TRUE;
  24. }
  25. else {
  26. $reference = mysql_error();
  27. return FALSE;
  28. }
  29. break;
  30. }
  31. }
  32. ?>

Zależy mi na napisaniu warunku, który pozwalałby na wysłanie zapytania w stylu:
INSERT INTO `tabela` VALUES ('x','y','z');
czyli bez podawania nazw pól w tabeli.

Wydaje mi się, że najłatwiejszym sposobem byłoby sprawdzenie indexów tablicy, czy są numerowane od zera wzwyż. Wydaje mi się też, że nie ma takiej funkcji, bo przeglądając manual, znalazłem tylko dwie funkcje, których skrócony opis zaczyna się wyrażeniem Checks mianowicie: array_key_exists i in_array...

Moje sugerowane rozwiązanie tego problemu to schematycznie:
Kod
<?
$i = -1;
foreach ($table as $index => $value) {
$i++;
if ($index != $i) {
  $false = '';
}
}
?>


Czy ktoś ma na myśli jakieś ciekawsze rozwiązanie? Dzięki winksmiley.jpg!
ennics
kiedyś napsałem coś takiego, ale już nie korzystam...
może sięprzyda

  1. <?php
  2.  
  3. //...
  4.  
  5. $show_fields = &#092;"SHOW FIELDS FROM \".$table.\"\";
  6. $query_show = mysql_query( $show_fields );
  7.  
  8. while ( $row = mysql_fetch_array( $query_show ) )
  9. {
  10. $_colNames[$table][] = $row['Field'];
  11. }
  12.  
  13. $n_colN = count( $_colNames[$table] )-1;
  14. $_colNames[$table] = array_slice( $_colNames[$table], 0, $n_colN ); // bez ostatniej kolumny
  15.  
  16. $sql = &#092;"INSERT INTO \".$table.\" (\";
  17. foreach ( $_colNames[$table] as $key => $val )
  18. {
  19. $sql .= &#092;"`\".$val.\"`, \"; // pola
  20. }
  21. $sql .= &#092;"`uniqNr`) VALUES (\"; // ostatnie bez przecinka
  22. foreach ( $_colNames[$table] as $key => $val )
  23. {
  24. if ( ereg( &#092;".+_lp$\", $val ) )
  25. {
  26. $sql .= &#092;"'', \"; // autoincrement - puste
  27. }
  28. else
  29. {
  30. $sql .= &#092;"'\".$$val. \"', \";
  31. }
  32. }
  33. $sql .= &#092;"'$uniqNr'\"; // ostatnie bez przecinka
  34. $sql .= &#092;")\"; // ostatnie bez przecinka
  35.  
  36.  
  37. ?>
Krzychur
Zapewniam Cie, że takie rozwiązanie, do takiego "duperelu" jest znacznym zwiększeniem czasu generowania strony, ale aby go użyć i tak muszę wiedzieć, jak programista zdecydował się odwołać się do metody.
ennics
metoda jest wyrwana z kontekstu kodu zbudowanego proceduralnie który stworzyłem na własne potrzeby. Trzeba eksperymentować ;]
wydajna nie jest, to napewno, ale pokazuje jak można zbudować sterownik do bazy danych który będzie zapisywał informacje bez konieczności podawania nazw kolumn ( są wczytywane przez SHOW FIELDS FROM table i obrabiane w tablicy asocjacyjnej ).
ActivePlayer
pomylisz kolejność, ilość pól, dodasz jakies pole do bazy - padnie. lepiej odpuść.
ennics
przyznam szczerze że nie rozwijałem tego kodu ale działał przez dłuższy czas i nie generował błędnych wpisów do bazy. Technicznie można doprowadzić kod do takiej postaci, że nie pozwoli na błąd programowy, niestety trudno przewidzieć czynnik ludzki ;]
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.