Update kliku wierszy różnymi wartościami wygenerowanymi przez funkcję

Update kliku wierszy różnymi wartościami wygenerowanymi przez funkcję
AC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Witam, Nie mogę ruszyć dalej z powodu opisanego poniżej, mam nadzieje że znajdziecie jakieś rozwiązanie i pomożecie.

Otóż, mam dwie tabele w jednej zapisywane jest numer zamówienia, które jest jednocześnie numerem id.
W kolejnej tworzą się wpisy dotyczące tego zamówienia - tyle towarów ile określone zostało w zamówieniu - $il
Teraz akcja - klikam przycisk aktywuj i chodzi mi o to aby podczas aktywacji zamówienia do tabeli z towarami dla danego zamówienia zapisywały się różne kody wygenerowane przez moją funkcję, jak na razie zapisuje się tylko do jednego towaru i już nie wiem gdzie zrobiłem bląd, może petla... poniżej kod

Kopiuj
 

 $zapytanie = "SELECT * FROM `SHOP_ORDER`";
 $wynik = mysql_query($zapytanie);

if(isset($_GET['nrzam']) and ($_GET['il'])){
	$nrzam = $_GET['nrzam'];
	$il = $_GET['il'];
	function NewGuid() { 
    $s = strtoupper(md5(uniqid(rand(),true))); 
    $guidText = 
        substr($s,0,4) . '-' . 
        substr($s,4,2) . '-' . 
        substr($s,12,4); 
    return $guidText;
	}
	$nr = NewGuid();
	
	mysql_query("UPDATE `SHOP_ORDER` SET `status` = 'active', `date_act` = curdate() WHERE `nrzam` = '$nrzam'");
	
	for($i=0;$i<$il;$i++){
	$w = mysql_query("SELECT * FROM `GWAR_SHOP`");
	$r = mysql_fetch_row($w);
	$id = $r[0];
	mysql_query("UPDATE `GWAR_SHOP` SET `nrgwar` = '$nr'  WHERE `nrzam` = '$nrzam' and `id` = '$id'");	
	}

}



 if ( !mysql_close() ) {
    echo 'Nie moge zakonczyc polaczenia z baza danych';
    exit (0);
 }
 ?>
	


		<div class="col-lg-10 col-md-offset-1">
			
			<table id="table_id" class="cell-border">
    <thead>
        <tr>
            <th>Sklep</th>
			<th>Nr zamówienia</th>
			<th>Data zamówienia</th>
            <th>Typ</th>
			<th>Model</th>
			<th>Cena</th>
			<th>Ilość</th>
			<th>Status</th>
			<th>Data aktywacji</th>
			<th>Akcja</th>
			
			
            
        </tr>
    </thead>
    <tbody>
		<?php
		while($row = mysql_fetch_assoc($wynik)){
		?>
        <tr>
            <td><?=$row['email']?></td>
			<td><?=$row['nrzam']?></td>
			<td><?=$row['datezam']?></td>
            <td><?=$row['prod_type']?></td>
			<td><?=$row['model']?></td>
			<td><?=$row['price']?></td>
			<td><?=$row['ilosc']?></td>
			<td><?=$row['status']?></td>
			<td><?=$row['date_act']?></td>
			<td align="center">
				<?
				if($row['status']=="inactive" or $row['status']==""){
					echo "<a href=\"index.php?page=admin_shop_order&nrzam=$row[nrzam]&il=$row[ilosc]\" name=\"act\" class=\"btn btn-warning btn-xs\">Aktywuj</a>";
				}
				?></td>
		 </tr>
		<?php 
		}
		?>
    </tbody>
</table>	
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

No ale na logikę.
W tym swoim kodzie raz, poza pętlą, wywołujesz funkcję do generowania guidu, no to w jaki potencjalny sposób miałaby ona generować więcej niż jeden numer?
Poza tym po co to "prośba o pomoc" w tytule? Szukałeś/szukałbyś rozwiązania tego problemu wpisując do Google "prośba o pomoc"? :|

PS ten Twój kod jest podatny na sql injection.
PPS masz dziwne nazewnictwo. Jedna SHOP_cośtam, druga cośtam_SHOP do tego jeszcze mieszając angielski z polskim. Trzymaj się jednego, angielskiego nazewnictwa.

AC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Uczę się dopiero wiec musicie mi wybaczyć tego typu błędy, spróbuje później zoptymalizować kod, teraz mi zależy na poprawnym wpisaniu w tabelę róznych wartości:

Wstawiłem funkcję w petlę ale UPDATE'uje mi tylko pierwszy wiersz...

Kopiuj
 for($i=0;$i<$il;$i++){
 
        $w = mysql_query("SELECT * FROM `GWAR_SHOP`");
        $r = mysql_fetch_row($w);
        $id = $r[0];
            if(!function_exists('NewGuid')){
                function NewGuid() { 
                    $s = strtoupper(md5(uniqid(rand(),true))); 
                    $guidText = 
                        substr($s,0,4) . '-' . 
                        substr($s,4,2) . '-' . 
                        substr($s,12,4); 
                    return $guidText;
                    }
                    }
        $nr = NewGuid();            
        mysql_query("UPDATE `GWAR_SHOP` SET `nrgwar` = '$nr'  WHERE `nrzam` = '$nrzam' and `id` = '$id'");    
    }
}
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

Wstawiłem funkcję w petlę

W jakim celu wstawiłeś tam całą definicję?

Poza tym błąd masz tutaj $id = $r[0]; - zawsze bierzesz pierwszy wiersz.

AC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Sorry, ale nie rozumiem - mógłbyś mi pomóc zmodyfikować ten kod?

Kopiuj
function NewGuid() { 
			$s = strtoupper(md5(uniqid(rand(),true))); 
			$guidText = 
				substr($s,0,4) . '-' . 
				substr($s,4,2) . '-' . 
				substr($s,12,4); 
    return $guidText;
	}
	
	for($i=0;$i<$il;$i++){
			$w = mysql_query("SELECT * FROM `GWAR_SHOP`");
			$r = mysql_fetch_assoc($w);
			$id = $r['id'];
	
	$nr = NewGuid();
				
	mysql_query("UPDATE `GWAR_SHOP` SET `nrgwar` = '$nr'  WHERE `nrzam` = '$nrzam' and `id` = '$id' ");	//
	} 
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

Chciałbym, ale jednocześnie chcę, abyś zrozumiał co robisz źle i nauczył się patrzeć na kod organoleptycznie.
Trochę kod poprawiłeś, teraz pora na drobną analizę:

Kopiuj
for($i=0;$i<$il;$i++) {
  $w = mysql_query("SELECT * FROM `GWAR_SHOP`");
  $r = mysql_fetch_assoc($w);
  $id = $r['id'];
 
  $nr = NewGuid();
 
  mysql_query("UPDATE `GWAR_SHOP` SET `nrgwar` = '$nr'  WHERE `nrzam` = '$nrzam' and `id` = '$id' ");    //
}

Na początku każdej iteracji w pętli wykonujesz to samo zapytanie, które zwraca te same wyniki, i zawsze bierzesz pierwszy wynik z tego zapytania.
Czyli ono może Ci zwracać przykładowo IDki 1, 2, 3, ale Ty zawsze bierzesz pierwszy, bo za każdym razem wywołujesz to zapytanie od nowa wewnątrz pętli. Widzisz błąd?

Poza tym masz bezsensowne nazewnictwo - staraj się unikać jednoliterowych nazw zmiennych, bo one nic nie mówią (wyjątkiem może być pętla).

AC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

OK powiem Ci jak ja to rozumiem:

Pobieram dane z tabeli GWAR_SHOP a dokładnie numery id wierszy
Nastepnie w pętli wykonuje się generowanie numerów z funkcji i update wszędzie tam gdzie nrzam = pobrany z GET-a oraz id pobrane z zapytania poza petlą?

Oczywiście nadal nie działa więc pewnie źle to rozumiem.

Kopiuj
 if(isset($_GET['nrzam']) and ($_GET['il'])){
	$nrzam = $_GET['nrzam'];
	$il = $_GET['il'];
	
    
	
	mysql_query("UPDATE `SHOP_ORDER` SET `status` = 'active', `date_act` = curdate() WHERE `nrzam` = '$nrzam'");
	
	
	function NewGuid() { 
			$s = strtoupper(md5(uniqid(rand(),true))); 
			$guidText = 
				substr($s,0,4) . '-' . 
				substr($s,4,2) . '-' . 
				substr($s,12,4); 
        return $guidText;
	}

			$result = mysql_query("SELECT * FROM `GWAR_SHOP`");
			$rows = mysql_fetch_assoc($result);
			$id = $rows['id'];
	
	for($i=0;$i<$il;$i++){
			
		$nr = NewGuid();

		mysql_query("UPDATE `GWAR_SHOP` SET `nrgwar` = '$nr'  WHERE `nrzam` = '$nrzam' and `id` = '$id'");
				
	}

} 
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

Teraz wykonujesz jedno zapytanie, to jest ok.
Ok nie jest już natomiast to, że w dalszym ciągu pobierasz jeden wiersz (jedno wywołanie fetch assoc).

AC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
1

Baaardzo dziękuję za wszystkie wskazówki:) Działa tak jak chciałem.
Jak znajdę trochę czasu to ujednolicę nazewnictwo i zabezpieczę kod przed sql injection.

Pozdrawiam

Kopiuj
$result = mysql_query("SELECT * FROM `GWAR_SHOP' WHERE `nrzam`= '$nrzam'");
            
 
    for($i=0;$i<$il;$i++){
        $rows = mysql_fetch_assoc($result);
        $id = $rows['id'];
        $nr = NewGuid();
 
        mysql_query("UPDATE `GWAR_SHOP` SET `nrgwar` = '$nr'  WHERE `nrzam` = '$nrzam' and `id` = '$id'");
 
    }
 

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.