[PHP]header(), Problem z wywolaniem polecenia |
[PHP]header(), Problem z wywolaniem polecenia |
27.08.2019, 21:45:10
Post
#1
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 27.08.2019 Ostrzeżenie: (0%) |
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... |
|
|
28.08.2019, 05:53:18
Post
#2
|
|
Grupa: Zarejestrowani Postów: 146 Pomógł: 19 Dołączył: 1.03.2012 Ostrzeżenie: (0%) |
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?
|
|
|
28.08.2019, 07:43:05
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 834 Pomógł: 225 Dołączył: 20.03.2005 Skąd: Będzin Ostrzeżenie: (0%) |
Może wywołanie header() ci się zapętla?
|
|
|
28.08.2019, 07:53:41
Post
#4
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 27.08.2019 Ostrzeżenie: (0%) |
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'); } |
|
|
28.08.2019, 09:18:31
Post
#5
|
|
Grupa: Zarejestrowani Postów: 6 365 Pomógł: 1114 Dołączył: 30.08.2006 Ostrzeżenie: (0%) |
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?
-------------------- |
|
|
28.08.2019, 09:54:33
Post
#6
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 27.08.2019 Ostrzeżenie: (0%) |
to sie wywala juz przy 10 rekordach...
|
|
|
28.08.2019, 09:55:51
Post
#7
|
|
Grupa: Zarejestrowani Postów: 6 761 Pomógł: 1822 Dołączył: 11.03.2014 Ostrzeżenie: (0%) |
Jak to się dzieje, że zmienna $stmt jest używana jako tablica, a w pętli nadpisywana?
-------------------- |
|
|
28.08.2019, 10:14:09
Post
#8
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 27.08.2019 Ostrzeżenie: (0%) |
zmieniłem to ale nie pomogło
|
|
|
28.08.2019, 10:19:47
Post
#9
|
|
Grupa: Zarejestrowani Postów: 6 761 Pomógł: 1822 Dołączył: 11.03.2014 Ostrzeżenie: (0%) |
A zdradzisz jak teraz wygląda kod?
-------------------- |
|
|
28.08.2019, 10:29:11
Post
#10
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 27.08.2019 Ostrzeżenie: (0%) |
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'); } |
|
|
28.08.2019, 10:31:20
Post
#11
|
|
Grupa: Zarejestrowani Postów: 6 761 Pomógł: 1822 Dołączył: 11.03.2014 Ostrzeżenie: (0%) |
A co zawiera zmienna $stmt?
Wstaw przed foreach: Kod var_dump($stmt);
-------------------- |
|
|
28.08.2019, 11:48:39
Post
#12
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 27.08.2019 Ostrzeżenie: (0%) |
object(PDOStatement)#3 (1) { ["queryString"]=> string(70) "SELECT * FROM `magazyn` ORDER BY `magazyn`.`name` ASC, ID, count, link" }
|
|
|
28.08.2019, 13:19:09
Post
#13
|
|
Grupa: Zarejestrowani Postów: 6 761 Pomógł: 1822 Dołączył: 11.03.2014 Ostrzeżenie: (0%) |
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. -------------------- |
|
|
28.08.2019, 13:19:16
Post
#14
|
|
Grupa: Zarejestrowani Postów: 6 365 Pomógł: 1114 Dołączył: 30.08.2006 Ostrzeżenie: (0%) |
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.
-------------------- |
|
|
28.08.2019, 15:09:26
Post
#15
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 27.08.2019 Ostrzeżenie: (0%) |
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ć |
|
|
28.08.2019, 15:18:18
Post
#16
|
|
Grupa: Zarejestrowani Postów: 6 365 Pomógł: 1114 Dołączył: 30.08.2006 Ostrzeżenie: (0%) |
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.
-------------------- |
|
|
28.08.2019, 15:41:07
Post
#17
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 27.08.2019 Ostrzeżenie: (0%) |
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(); } |
|
|
28.08.2019, 15:55:07
Post
#18
|
|
Grupa: Zarejestrowani Postów: 594 Pomógł: 66 Dołączył: 22.02.2008 Skąd: Dublin Ostrzeżenie: (0%) |
a ten goly srednik pod koniec co tam robi
-------------------- |
|
|
28.08.2019, 16:07:03
Post
#19
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 27.08.2019 Ostrzeżenie: (0%) |
usunąłem średnik ale nadal nie działa
|
|
|
28.08.2019, 16:14:11
Post
#20
|
|
Grupa: Zarejestrowani Postów: 594 Pomógł: 66 Dołączył: 22.02.2008 Skąd: Dublin Ostrzeżenie: (0%) |
ten ?
cos wogole sie wyswietla? daj zamiast header jakies echo i spraedz czy sie wysw -------------------- |
|
|
Wersja Lo-Fi | Aktualny czas: 19.04.2024 - 21:24 |