Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ilość kolumn z zapytania select
Forum PHP.pl > Forum > PHP
tosiek
Witam. Oto kod:
  1. <?php
  2. if (!$lista_tabel = mysqli_query($db, "SHOW TABLES;"))
  3.    {
  4.      $info["error"][] = "Błąd bazy danych (".mysqli_errno($db)."): ".mysqli_error($db);
  5.    }
  6.    else
  7.    {
  8.      $info['ok'][] = "Pobrano listę tabel";
  9.    }
  10. while($tabela = mysqli_fetch_row($lista_tabel))
  11. {
  12.    if(!$zawartosc = mysqli_query($db, "SELECT * FROM {$tabela[0]};"))
  13.    {
  14.        $info["error"][] = "Błąd bazy danych (".mysqli_errno($db)."): ".mysqli_error($db);
  15.    }
  16.    else
  17.    {
  18.        $info['ok'][] = "Pobrano tabele: {$tabela[0]}";
  19.    $zawartosc = mysqli_fetch_row($zawartosc);
  20.    for( $i = 0, $cnt = count($zawartosc); $i <= $cnt; $i++)
  21.        {
  22.        $query .= "'".$zawartosc[$i]."', ";
  23.  
  24.        }
  25.        if(!$zawartosc = mysqli_query($db, "REPLACE INTO {$tabela[0]} VALUES({$query});"))
  26.    {
  27.            echo "REPLACE INTO {$tabela[0]} VALUES({$query});<br />";
  28.        $info["error"][] = "Błąd bazy danych (".mysqli_errno($db)."): ".mysqli_error($db);
  29.    }
  30.    }
  31. ?>


I niestety ale ilość kolumn w $query nie zgadza się z ilością w tabeli.

Czy ktoś ma pomysł jak to naprawić, lub jak nadpisać tabelę(wiersze i kolumny - wszystkie) jej własną wartością, tak ażeby móc zmieniać dane przed REPLACE ?
erix
A nie lepiej insert into ... on duplicate key?
tosiek
Zauważyłem że Ani Replace ani
Kod
INSERT INTO {$tabela[0]} VALUES({$query}) ON DUPLICATE KEY UPDATE;

nie zamieniają wartości sad.gif

zgadza się ilość kolumn (chyba):
  1. <?php
  2. for( $i = 0, $cnt = count($zawartosc); $i <= $cnt; $i++)
  3.        {
  4.        if($i < $cnt)
  5.            {
  6.        $query .= "'".addslashes($zawartosc[$i])."', ";
  7.            }
  8.            else
  9.            {
  10.                $query .= "'".addslashes($zawartosc[$i])."'";
  11.            }
  12.  
  13.        }
  14.        if(!$zawartosc = mysqli_query($db, "INSERT INTO {$tabela[0]} VALUES({$query}) ON DUPLICATE KEY UPDATE;"))
  15.    {
  16.            echo "INSERT INTO {$tabela[0]} VALUES({$query}) on duplicate key update;<br />";
  17.        $info["error"][] = "<br />Błąd bazy danych (".mysqli_errno($db)."): ".mysqli_error($db)."$query<br />$tabela[0]<br />";
  18.    }
  19.    }
  20. ?>


hmm tak jakby próbowalo wsadzić kilka z zapytań wo wszystkich tabel. Nie mogę znaleźć błędu sad.gif
Kurde jak pobrać dane z jednej tabeli i potem je w ją wsadzić w tej samej kolejności sad.gif (tzn kolejność kolumn)
przykładowy błąd:
Kod
string(223) "<br />B��d bazy danych (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1'0', '0', '',

i jest on przy kilku tabelach.
potem zmienia sie na inny przy kilku innych tabelach.
erix
A może byś tak podał strukturę?
tosiek
To miało być uniwersalne niezależne od tabel, bazy etc.

Testuje to na bazie od phpBB 2 by przemo
erix
Nieważne, co miało być - najpierw trzeba rozpatrzeć konkretny przypadek.
tosiek
Kod
Blad bazy danych (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1'0', '0', '', ''
phpbb_adv_person

Zapytanie SQL: SELECT * FROM `phpbb_adv_person`;
Rekordów: 1
user_id person_id person_ip
0 0
erix
Yyyy, i to dla tego zapytania wywala...?
tosiek
wywala dla:
Kod
INSERT INTO phpbb_adv_person VALUES('0', '0', '', '') on duplicate key update;

ehh skrypt wysypuje się chyba przy jakiejkolwiek pustej kolumnie w wierszu, tylko nie wiem czemu. Bo jeśli przy pustej to czemu jest o jedna więcej w insercie ;/
erix
A samo insert into bez update'u działa?
tosiek
Nie bo są tylko 3 kolumny:
user_id person_id person_ip

A o select tej tabeli i przejściu przez skrypt wyżej chce wciskać 4 ;/ Jest jeden wpis dla tej tabeli, z czego person_ip jest puste.
erix
Cytat
Nie bo są tylko 3 kolumny:
user_id person_id person_ip

To może po prostu podaj wstawiane wartości...?
tosiek
podawałem, podawałem winksmiley.jpg ale to przez count, bo count nie liczy od 0 winksmiley.jpg

teraz zacząłem sprawdzać czy kolumna jest liczbą:
  1. <?php
  2. if (!$lista_tabel = mysqli_query($db, 'SHOW TABLES;')) {
  3.    $info['error'][] = 'Błąd bazy danych ('.mysqli_errno($db).'): '.mysqli_error($db);
  4. }
  5. else {
  6.    $info['ok'][] = 'Pobrano listÄ™ tabel';
  7. }
  8. while($tabela = mysqli_fetch_row($lista_tabel)) {
  9.    if(!$zawartosc = mysqli_query($db, 'SELECT * FROM '.$tabela[0].';')) {
  10.    $info['error'][] = 'Błąd bazy danych ('.mysqli_errno($db).'): '.mysqli_error($db);
  11.    }
  12.    else {
  13.    $info['ok'][] = 'Pobrano tabele: {$tabela[0]}';
  14.    
  15.    $fields = array();
  16.    while($field = mysqli_fetch_field($zawartosc)) {
  17.        $fields[$field->name] = in_array(strtolower($field->type), array(1, 2, 9, 3, 8)) ? TRUE : FALSE;
  18.    }
  19.    while($zawartosc2 = mysqli_fetch_assoc($zawartosc)) {
  20.        $rows[] = $zawartosc2;
  21.        
  22.    }
  23.    $tmp = array();
  24.    foreach($rows as $row=>$val) {
  25.        if($val === NULL) {
  26.        $tmp[] = 'NULL';
  27.        }
  28.        elseif($fields[$row] == TRUE) {
  29.        $tmp[] = $val;
  30.        }
  31.        else {
  32.        $tmp[] = '"'.$val.'"';
  33.        }
  34.    }
  35.    
  36.    
  37.    if(!$zawartosc = mysqli_query($db, 'INSERT INTO '.$tabela[0].' VALUES('.implode(', ', $tmp).')ON DUPLICATE KEY UPDATE;')) {
  38.        echo 'INSERT INTO '.$tabela[0].' VALUES('.implode(', ', $tmp).')ON DUPLICATE KEY UPDATE;<br />';
  39.        $info['error'][] = '<br />Błąd bazy danych ('.mysqli_errno($db).'): '.mysqli_error($db).'<br />';
  40.    }
  41.    }
  42. ?>


ale teraz nie wiem czemu zwraca mi:
INSERT INTO phpbb_adv_person VALUES("Array")ON DUPLICATE KEY UPDATE;

czemu implode zwraca tablice :|
Darti
  1. <?php
  2. $tmp = array();
  3.   foreach($rows as $row) {
  4.   foreach($row as $key=>$val){
  5.       if($val === NULL) {
  6.       $tmp[] = 'NULL';
  7.       }
  8.       elseif($fields[$row] == TRUE) {
  9.       $tmp[] = $val;
  10.       }
  11.       else {
  12.       $tmp[] = '"'.$val.'"';
  13.       }
  14.   }
  15. }
  16. ?>
tosiek
małe poprawki i działa biggrin.gif zapomniałem że tamta tablica zawiera podtablice biggrin.gif
  1. <?php
  2. foreach($rows as $row) {
  3.  foreach($row as $key=>$val){
  4.      if($val === NULL) {
  5.      $tmp[] = 'NULL';
  6.      }
  7.      elseif($fields[$key] == TRUE) {
  8.      $tmp[] = $val;
  9.      }
  10.      else {
  11.      $tmp[] = '''.$val.''';
  12.      }
  13.  }
  14. }
  15. ?>


Kod
INSERT INTO phpbb_advertisement VALUES('0', '0', '')ON DUPLICATE KEY UPDATE;

czemu sie wysypuje na takich zapytaniach :|

tak samo:
Kod
REPLACE INTO phpbb_advertisement VALUES('0', '0', '');

:|

to znaczy nadl sie sypie przy:
Warning: Illegal offset type in /home/tosiek/domains/tosiek.pl/public_html/koderek/converter.php on line 46

elseif($fields[$row] == true) {
erix
Strzelam, że jako klucz podajesz inną tablicę...
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.