Nie działa wstawianie rekordów z uzyciem implode w php


(hatezit) #1

Witam,
Mam pytanie, dlaczego poniższy skrypt nie dodaje mi do bazy. Zwykle dodaje, ale nawet dla pojedynczego pola, też nie chce dodać. Oto kod:
<?php
require_once(‘db/dbc.php’);
if(isset($_POST[‘submit’])){
$username = $_POST[‘username’];
$group = implode(’ , ’ , $_POST[‘group’]);

	//print_r($_POST);	 

	
	if(empty($username)){
		echo "Puste pole nazwy użytkownika!";
	}else{
	 
		    $sql = $db->query("INSERT INTO users_group (username, group) VALUES('$username', '$group')");
		
			 // $sql = "INSERT INTO users_group (username, group) VALUES(?,?)";
				// if($query = $db->prepare($sql)){
				   // $query->bind_param('ss',$username, $group);
				   // $query->execute();
				   // echo "<div class=\"accept\">";
				   // echo " &radic; Pomyślnie dodano nowego użytkownika do kategorii!<br>";
				   // echo "</div>";
				// }else{
				 // echo '<div class="error">Błąd ustawień!</div>';
			// }
		
		
	}
	echo $sql =$db->affected_rows;
	
}


?>

Jak widać, też próbowałem przez bind_param i nie dodaje mi a chciałem zrobić jak na tym filmie, ale z innymi nazwami pól.

Czemu nie dodaje mi do bazy?


(Fizyda) #2

Jak wygląda struktura bazy danych? Albo chociaż tej konkretnej tabeli, może na początek wystarczy.

Nie wiem czy to błąd wstawiania czy robisz to celowo, ale czemu tutaj:

require_once(‘db/dbc.php’);
if(isset($_POST[‘submit’])){
$username = $_POST[‘username’];
$group = implode(’,’, $_POST[‘group’]);

używasz na początku stringa kopnięty apostrof, a następnie zamykasz zwykłym? To nie jest poprawnie.


(hatezit) #3

Skoro nie jest poprawnie, to dlaczego na filmie widać, że działa dodawanie a u mnie nie? Struktura tabeli, to trzy pola. id z int, kolejne dwa pola(username i group) to varchar po 100 i 256.


(AnonimX) #4

Są 2 rozwiązania:

  1. Brak połączenia z bazą - zła ścieżka lub błąd w kodzie dbc.php. Wpisz zapytanie z palca i sprawdź, czy coś doda.
  2. Błąd w zapytaniu SQL. Wyświetl sobie zapytanie przy pomocy echo i wklej w phpMyAdmin, czy zadziała.

(hatezit) #5

Połączenie z bazą jest poprawne, bo wcześniej dodawałem tylko jedno pole do jednej kolumny. Błąd jest w zmiennej group implode. A taki mam formularz:

Nazwa użytkownika:

Grupy
 <div>Administracja <input type="checkbox" name="group[]" value="administracja"/></div>
 <div>Moderatorzy <input type="checkbox" name="group[]" value="moderatorzy"/></div>
 <div>Testerzy <input type="checkbox" name="group[]" value="testerzy"/></div>
 <div>Default <input type="checkbox" name="group[]" value="default"/></div>
 <input type="submit" name="submit" value="Dodaj użytkownika"/>
 </form>

(AnonimX) #6

Zastanawia mnie group w zapytaniu. Używanie słów kluczowych MySQL jako nazw pól jest bardzo ryzykowne.
Zmień: INSERT INTO users_group (username, group) VALUES
Na: INSERT INTO users_group (username, group) VALUES
Edycja: nie widać tego, ale username i group jest w odwróconym apostrofie - znak na przycisku z tyldą (obok 1).
Tutaj podgląd kodu: https://pastebin.com/4qM8xZzu


(Fizyda) #7

Niepoprawny jest sposób deklaracji stringów, a nie dodawania.

Podejrzyj w ogóle zapytanie jak wygląda przed wysłaniem i sprawdź błędy, uważam, że one najwięcej Ci powiedzą w czym jest problem. Tutaj masz przykład: http://php.net/manual/pl/mysqli.query.php.
Dodatkowo nazwy kolumn jednak zapisywałbym w odwróconych apostrofach, tak jak radzi @AnonimX


(hatezit) #8

Zanim założyłem temat, to sprawdzałem po Values z tyldami, również z zapisem takim: " ‘.$group.’ " i też nie działa. Najbardziej mi zależy, aby mi dodawało używając bind_param. Tylko dlaczego na filmie, działa dodawanie a u mnie nie? Kiedy użyłem dodawania bez bind param i dałem echo $sql = $db->affected_rows;, to w echo miałem -1.
Zależy aby mając zmieną w tablicy, można dodać 4 kategorie do jednego pola, dlatego mam w każdym inpucie group[ ].
Update!
Problem rozwiązany. Okazało się, że nazwa kolumny group była podświetlona na niebiesko a nie na ciemny zielony (użyłem programu HeidiSQL). I teraz w obu zapytaniach działa dodawanie.