Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]header()
Forum PHP.pl > Forum > Przedszkole
Kaczmar
Witam
Mam problem z wywolaniem komendy header(). Problem polega na tym ze komende otwarcia nowej strony poprzedza proste zapytanie sql. Jesli mam kilka rekordow w bazie to skrypt sie wywoluje i dziala komenda header() ale kiedy w bazie rekordow jest troche wiecej to tak jakby zapytanie sql sie wydluza i nie odpala sie ta komenda...
leonpro778
Co znaczy "się wydłuża" ? Może jakiś timeout jest w PHP ustawiony? Pokaż kod jak masz to zrobione. Wyskakują Ci jakieś błędy?
Tomplus
Może wywołanie header() ci się zapętla?
Kaczmar
Chodzi o to że klikam przycisk i jeśli wypełnione są pola w inputach to ona mają się zaktualizować w bazie a następnie ma się przeładować nowa strona.
Działa to bez problemu dla około 10 rekordów w bazie ale jak jest ich więcej to przestaje się wykonywać to polecenie o przeładowaniu strony.
Baza się aktualizuje tak jak trzeba ale nie przeładowuje się do innej strony.

Kod
if($_SERVER['REQUEST_METHOD'] == 'POST')
    {
        
        $stmt = $pdo->query('SELECT * FROM `magazyn` ORDER BY `magazyn`.`name` ASC, ID, count, link');
        
        
        foreach($stmt as $row)
        {
            
            
            $stmt = $pdo -> prepare('UPDATE magazyn
                SET count=:count
                WHERE ID=:ID;
                ');
            
            if ($_POST['ilosc'.$row['ID']] <> '') {
                
                $dodanie = $_POST['ilosc'.$row['ID']];
                $nowa_wartosc = $row['count'];
                
                $stmt -> bindValue(':ID', $row['ID'], PDO::PARAM_INT);      
                $stmt -> bindValue(':count', $nowa_wartosc - $dodanie, PDO::PARAM_INT);
               ;
            }
            

            $stmt->execute();
            
            
        }
        
        header('Location:/chlodnia/index.html');
        
    }
viking
Jak masz milion rekordów w tej bazie to wiadomo że takie zapytanie musi wszystkie przerobić. Nie możesz tego przerobić żeby aktualizować tylko rekordy z forma?
Kaczmar
to sie wywala juz przy 10 rekordach...
trueblue
Jak to się dzieje, że zmienna $stmt jest używana jako tablica, a w pętli nadpisywana?
Kaczmar
zmieniłem to ale nie pomogło
trueblue
A zdradzisz jak teraz wygląda kod?
Kaczmar
Kod
if($_SERVER['REQUEST_METHOD'] == 'POST')
    {
                          
       $stmt = $pdo->query('SELECT * FROM `magazyn` ORDER BY `magazyn`.`name` ASC, ID, count, link');

        foreach($stmt as $row)
        {
            
        
        $stmte = $pdo -> prepare('UPDATE magazyn
                SET count=:count
                WHERE ID=:ID;
                ');    
        
        if ($_POST['ilosc'.$row['ID']] <> '') {
            
            $dodanie = $_POST['ilosc'.$row['ID']];
            $nowa_wartosc = $row['count'];
            
            $stmte -> bindValue(':ID', $row['ID'], PDO::PARAM_INT);            
            $stmte -> bindValue(':count', $nowa_wartosc + $dodanie, PDO::PARAM_INT);
    
           ;        
            
        }

        $stmte->execute();

        };
        header('Location:/chlodnia/index.html');
    }
trueblue
A co zawiera zmienna $stmt?
Wstaw przed foreach:
Kod
var_dump($stmt);
Kaczmar
object(PDOStatement)#3 (1) { ["queryString"]=> string(70) "SELECT * FROM `magazyn` ORDER BY `magazyn`.`name` ASC, ID, count, link" }
trueblue
Prawdopodobnie chodzi o nazwę kolumny count, należałoby ją ująć w odwróconych apostrofach, czyli `count`.
Ale:
1. Nie jest Ci potrzebna klauzula ORDER BY w zapytaniu, chyba, że wykorzystujesz wyniki tego zapytanie gdzieś dalej,
2. Nie potrzeba wyciągać wszystkich kolumn, bo wykorzystujesz tylko count i id,
3. Zapytanie SELECT nie jest potrzebne jeśli nie wykorzystujesz wyników gdzieś dalej,

4. Całość możesz uprościć do pętli po otrzymanych id. W środku pętli UPDATE na zasadzie `count`=`count`+:dodanie,
5. Zamiast bindValue możesz użyć bindParam przygotowując zapytanie tylko raz, przed pętlą foreach.
viking
To możesz zmodyfikować jak sugerowałem aby zapytanie pobierało tylko rekordy podlegające modyfikacji? Chyba że zawsze zmieniasz wszystkie z bazy. Do tego zmienił bym to co wysyłasz postem na dane tablicowe.
Kaczmar
dziękuję za wszelką pomoc
rozwiązanie jest banalne ale jednocześnie "dziwne" ale nie wiem jak to mogłem przeoczyć.
Przy generowaniu formularza zrobiłem coś takiego:
Kod
<input type="number" name="ilosc'.$row['ID'].'"/>


jak zauważycie na końcu dałem /
i po usunięciu wszystko działa jak trzeba
kurde nie wiem dlaczego dla 15 rekordów było OK a powyżej 15 przestawało działać
viking
Zamknięcie elementu jest poprawne. Pewnie wpływalo na coś zupełnie innego gdzieś wcześniej. Ja bym wrzucił w takim razie do validatora w3c cały html strony. Inna sprawa że to co robisz jest nieoptymalne.
Kaczmar
Wiem że robię to chałupniczo ale nie jestem informatykiem a mam do zrobienia w firmie bardzo prosty programik. Już się ucieszyłem że działa ale niestety przedwcześnie.
załaczam cały plik (oczywiście bez danych do bazy)
skrypt ma na celu pobrać za bazy fotkę, ilość i nazwę.
Następnie mają się wyświetlić przy produkcie inputy w które wpisuje się ilości a następnie jednym przysiskiem ma sie zaktualizować ilość przy produkcie a strona się ma przeładować w inne miejsce...
Wszystko działa poza tym pierdzielonym przeładowaniem strony
Zerknijcie błagam jeszcze raz bo przecież oszaleję...
Kod
try{
    $pdo = new PDO('mysql:host='.$mysql_host.';dbname='.$database.';port='.$port, $username, $password );
    echo '';//Połączenie nawiązane!
}catch(PDOException $e){
    echo 'Połączenie nie mogło zostać utworzone.<br />';
}

echo '<h1>PODAJ DODAWANĄ ILOŚĆ </h1>';

try
{
    
  // $stmt = $pdo->query('SELECT ID, name, count, link FROM magazyn');
     $stmt = $pdo->query('SELECT * FROM `magazyn` ORDER BY `magazyn`.`name` ASC, ID, count, link');
    echo '<form method="post">';
    
    foreach($stmt as $row)
    {   echo '<div class="prod">';
            
                echo '<div><img src="http://www.'.$row['link'].'" alt="foto" height="200" width="200"></div>';
            
            
            echo '<div class="oooo">';
                echo '<h2>'.$row['name'].'</h2> | stan: '.$row['count'].'</br>';
                
                
                
               echo 'WPROWADŹ ILOŚĆ: <input type="text" name="ilosc'.$row['ID'].'">';
            
             //   echo 'WPROWADŹ ILOŚĆ: <input type="number" name="ilosc'.$row['ID'].'"/>';
            //  echo 'WPROWADŹ ILOŚĆ: <input type="number" name="ilosc'.$row['ID'].'"/>';
                
        echo '</div></div>';        
    }
    
    
     $stmt->closeCursor();
    
    echo '
         <div style="display: block; clear: both; height: 2px"></div>
         <a href="../chlodnia/index.html" class="anuluj">« ANULUJ</a>  
         <div class="but_dodaj">
         <input type="submit"  value="+ DODAJ" name="f">
         </div>
         </form>
        ';
    
}
catch(PDOException $e)
{
    echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
}


// aktualizacja stanów
try
{
    if($_SERVER['REQUEST_METHOD'] == 'POST')
    {
                          
       //  $stmt = $pdo->query('SELECT ID, name, count, link FROM magazyn');
       $stmt = $pdo->query('SELECT * FROM `magazyn` ORDER BY `magazyn`.`name` ASC, ID, count, link');

      
        foreach($stmt as $row)
        {
          
        $stmte = $pdo -> prepare('UPDATE magazyn
                SET `count`=:count
                WHERE ID=:ID;
                ');    
        
        if ($_POST['ilosc'.$row['ID']] <> '') {
            
            $dodanie = $_POST['ilosc'.$row['ID']];
            $nowa_wartosc = $row['count'];
          //  echo $nowa_wartosc;
          
            $stmte -> bindValue(':ID', $row['ID'], PDO::PARAM_INT);            
            $stmte -> bindValue(':count', $nowa_wartosc + $dodanie, PDO::PARAM_INT);
            //$stmt -> bindValue(':count', $_POST['ilosc'.$row['ID']], PDO::PARAM_INT);      
           ;        
            
         }

         $stmte->execute();

         };
        
         header('Location:/chlodnia/index.html');

    }
}

catch(PDOException $e)
{
    echo 'Wystapil blad biblioteki PDO: ' . $e->getMessage();
}
dublinka
a ten goly srednik pod koniec co tam robi
Kaczmar
usunąłem średnik ale nadal nie działa
dublinka
ten ?

  1. //$stmt -> bindValue(':count', $_POST['ilosc'.$row['ID']], PDO::PARAM_INT);
  2. ;
  3.  


cos wogole sie wyswietla?
daj zamiast header jakies echo i spraedz czy sie wysw
trueblue
Funkcja header nie wykona się przez każde wykonane echo, które jest przed nią.
Lord
Serwer na Windows ?
A może to tutaj problem w braku exitu?
  1. header('Location: <a href="http://www.example.com/&#39%3b%29;" target="_blank">http://www.example.com/');</a>
dublinka
a gdzie tam jest echo jedynie kaszani ten ';'

wlacz kolego raportowanie bledow

error_reporting(E_ALL);

na gorze strony
Kaczmar
nie wywala żadnych błędów;
jedynie co zauważyłem że może widzicie jakiś błąd w tym miejscu:

Kod
echo 'WPROWADŹ ILOŚĆ: <input type="text" name="ilosc'.$row['ID'].'">';


bo jak wstawiam np. name="kjhdfkjhsdkjfh" to header() zaczyna się wykonywać.
dublinka
Cytat(Kaczmar @ 29.08.2019, 11:16:27 ) *
nie wywala żadnych błędów;
jedynie co zauważyłem że może widzicie jakiś błąd w tym miejscu:

Kod
echo 'WPROWADŹ ILOŚĆ: <input type="text" name="ilosc'.$row['ID'].'">';


bo jak wstawiam np. name="kjhdfkjhsdkjfh" to header() zaczyna się wykonywać.

Sprzwdz zrodlo strony co sie w tym name pokazuje
Kaczmar
Znalazlem pewna prawidlowosc. Tam gdzie jest petla ktora generuje inputy nie moze zawierac zadnych wyrazen typu class="gghhgg" albo style...musi byc "czysty" html.
Skrypt dziala poprawnie ale nie moge mu nadac odpowiedniego wygladu... no coz wazne ze dziala
dublinka
Cytat(Kaczmar @ 2.09.2019, 21:09:11 ) *
Znalazlem pewna prawidlowosc. Tam gdzie jest petla ktora generuje inputy nie moze zawierac zadnych wyrazen typu class="gghhgg" albo style...musi byc "czysty" html.
Skrypt dziala poprawnie ale nie moge mu nadac odpowiedniego wygladu... no coz wazne ze dziala

Musisz miec gdzies bledy.
Nie pkkazakes jak to wyglada jak generujesz te inputy
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-2024 Invision Power Services, Inc.