• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PHP/MySQLi Pobranie z bazy i uaktualnienie informacji

0 głosów
692 wizyt
pytanie zadane 28 września 2016 w PHP przez Kshyhoo Użytkownik (780 p.)

Chcę dodać informację w bazie danych dotyczącą nowego użytkownika. Pobieram więc potrzebne dane z bazy, ale nie umiem sklecić odpowiedniej pętelki, żeby dodać dane do bazy. Mój kod:

<?php
if (!$error) {
	$sql1 = "INSERT INTO users ( ... ) VALUES ( ... )";
	if(mysqli_query($con, $sql1)) {
		// pobranie ostatnio dodanego ID usera
		$id_u = mysqli_insert_id($con);

		// pobranie numerów ID z tabeli
		$sql2 = "SELECT id FROM adv";
		$result2 = mysqli_query($con, $sql2);
		while($row2 = mysqli_fetch_array($result2)) {
			$uid[] = $row2['id'];
		}

		// pobranie ilości ID z tabeli do pętli
		$ile = mysqli_num_rows($result2);

		// dodanie do tabeli stat
		// TU MI COŚ KULEJE
		for ($i=1; $i<$ile+1; $i++) {
			$sql3 = "INSERT INTO stat (id_u, id_a, score) VALUES ('".$id_u."', '".$uid."', 0)";
			mysqli_query($con, $sql3);
		}
		$successmsg = "Dodano usera ID: ".$id_u.": ".$name."";
	} else {
		$errormsg = "Nie dodano!";
	}
}
?>

1 odpowiedź

+1 głos
odpowiedź 28 września 2016 przez Piotr Użytkownik (680 p.)
wybrane 29 września 2016 przez Kshyhoo
 
Najlepsza

Zmienna $uid którą masz w pętli jest tablicą. Jeżeli potrzebujesz zapisać tablicę w bazie danych użyj funkcji serialize(). Poza tym nie powinieneś wysyłać zapytania do bazy danych w pętli (co jeżeli zmienna $ile będzie równa 1000? - wykonasz 1000 zapytań!). Proponuje w pętli utworzyć tylko SQL, a za pętlą to wykonać. 

komentarz 28 września 2016 przez Kshyhoo Użytkownik (780 p.)

No właśnie wpadłem na taki pomysł:

while($row2 = mysqli_fetch_array($result2)) {
	$uid = $row2['id'];
	$sql3 = "INSERT INTO stat (id_u, id_a, score) VALUES ('".$id_u."', '".$uid."', 0)";
	mysqli_query($con, $sql3);
}

Czyli od razu po pobraniu rekordu następuje INSERT.

komentarz 29 września 2016 przez Piotr Użytkownik (680 p.)

Chodziło mi o coś takiego:

$sql = 'INSERT INTO `stat` (id_u, id_a, score) VALUES ';
foreach(mysqli_fetch_all($result, MYSQLI_ASSOC) as $l => $row) {
	if($l)
		$sql .= ',';

	$id_a = $row['id'];
	$sql .= "('$id_u', '$id_a', 0)";
}
if(strlen($sql) > 46)
	mysqli_query($con, $sql);

Dzięki temu wykonasz zawsze tylko jedno zapytanie do bazy. Poza tym, gdy otwierasz podwójny cudzysłów nie musisz go zamykać aby wstawić zmienną.

komentarz 29 września 2016 przez Kshyhoo Użytkownik (780 p.)

Super, sam nigdy bym na to nie wpadł. Nie kumam, tylko wiersza:

if(strlen($sql3) > 46)
komentarz 30 września 2016 przez Piotr Użytkownik (680 p.)
Funkcja strlen (string length czyli długość łańcucha) zwraca ilość znaków w podanym ciągu (napisie) np. strlen("String") zwróci 6 (ponieważ wyraz "String" ma 6 znaków).

W podanym prze zemnie przykładzie sprawdzam czy $sql ma więcej znaków niż 46, ze względu na to, że funkcja w pętli foreach "mysqli_fetch_all($result, MYSQLI_ASSOC)" mogłaby zwrócić pustą tablicę. W takim przypadku zmienna $sql miałaby wartość "INSERT INTO `stat` (id_u, id_a, score) VALUES ", co spowodowałyby poważny błąd przy wykonaniu funkcji mysqli_query($con, $sql). Podczas gdy jeżeli zmienna $sql ma ponad 46 znaków wiem, że na 100% są podane jakieś wartości do wstawienia i próba wywołania zapytania do bazy danych nie wywoła błędu.
komentarz 30 września 2016 przez Kshyhoo Użytkownik (780 p.)
Teraz wszystko jasne. Jeszcze raz wielkie dzięki.

Podobne pytania

0 głosów
2 odpowiedzi 1,605 wizyt
+2 głosów
0 odpowiedzi 1,125 wizyt
pytanie zadane 18 stycznia 2021 w PHP przez ZeRo_ Nowicjusz (180 p.)
0 głosów
1 odpowiedź 647 wizyt
pytanie zadane 26 lipca 2019 w PHP przez Haker Nowicjusz (120 p.)

93,776 zapytań

142,736 odpowiedzi

323,388 komentarzy

63,381 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...