• 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

Object Storage Arubacloud
0 głosów
300 wizyt
pytanie zadane 28 września 2016 w PHP przez Kshyhoo Użytkownik (750 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 (750 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 (750 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 (750 p.)
Teraz wszystko jasne. Jeszcze raz wielkie dzięki.

Podobne pytania

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

92,552 zapytań

141,399 odpowiedzi

319,534 komentarzy

61,938 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...