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

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

 

 $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>	
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.

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...

 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'");    
    }
}
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.

0

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

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' ");	//
	} 
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ę:

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).

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.

 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'");
				
	}

} 
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).

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

$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'");
 
    }
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1