Pobieranie danych z bazy za pomocą PDO - ignorowanie istniejącej wartości

0

Cześć!

Zaczynam od niedawna zabawę z PHP i natrafiłam na pewien problem. Łączę się z bazą MySQL za pomocą PDO. Chcę sprawdzić, czy w bazie danych w kolumnie DLUGI_LINK jest określona wartość. Jeśli jest, to ma się pojawić odpowiedni komunikat oraz wyświetlona wartość z sąsiedniej kolumny (kolumna SKROCONY_LINK) z tego samego wiersza. I to działa. Gdy tej wartości nie ma, wówczas dodaję kolejny wiersz do bazy MySQL.

Problem pojawia się wtedy, gdy ta baza jest sprawdzana po raz kolejny, gdy podawana jest już dodana wcześniej wartość (program dodaje mi po raz kolejny tę samą wartość. Podaję kod poniżej:

<?php		
	//podejrzyj dane w tabeli
	//require_once "dane_w_tabeli.php";
	$podany_dlugi_link = $_POST["dlugi_link"];
	$data = date("Y-m-d H:i:s");
	
	$zapytanie = "SELECT * FROM linki";
	$rezultat = $handler->query($zapytanie);

	while($wiersz = $rezultat->fetch(PDO::FETCH_ASSOC))
	{
		//echo($wiersz["DLUGI_LINK"]."<br/>");
		if ($podany_dlugi_link == $wiersz["DLUGI_LINK"])
		{
			echo("Link jest już w bazie. Wersja skrócona: ".$wiersz["SKROCONY_LINK"]);
			break;//przerwij pętlę jeśli znajdziesz taki rekord
		}
		else
		{
			$zapytanie = "INSERT INTO LINKI VALUES(null,\"$podany_dlugi_link\",\"$podany_dlugi_link _SKROCONY\",\"$data\",0)";
			$rezultat = $handler->query($zapytanie);
			//echo("Zapytanie to: ".$zapytanie."<br/>");
			echo("Dodano<br/>");
			break;
		}
	}
?>

Siedzę już kilka dobrych godzin nad tym i nie wiem dlaczego tak się dzieje. Macie może jakieś pomysły?

Pozdrawiam!

0

Nie rób wyszukiwania w php, zrób to w mysql. Zmień zapytanie na coś w stylu: "SELECT * FROM linki WHERE dlugi_link = :link", a potem skorzystaj z parametryzacji i w miejsce :link wstaw szukaną wartość. Jeśli select nic nie zwróci, to wtedy dodajesz rekord.

0
serek napisał(a):

Nie rób wyszukiwania w php, zrób to w mysql. Zmień zapytanie na coś w stylu: "SELECT * FROM linki WHERE dlugi_link = :link", a potem skorzystaj z parametryzacji i w miejsce :link wstaw szukaną wartość. Jeśli select nic nie zwróci, to wtedy dodajesz rekord.

Czy może chodzi Ci o takie coś:

$zapytanie = "SELECT * FROM linki WHERE DLUGI_LINK = \"$podany_dlugi_link\"";

A w jaki sposób sprawdzić, czy SELECT nic nie zwróci?

0
Kaska1988 napisał(a):
serek napisał(a):

Nie rób wyszukiwania w php, zrób to w mysql. Zmień zapytanie na coś w stylu: "SELECT * FROM linki WHERE dlugi_link = :link", a potem skorzystaj z parametryzacji i w miejsce :link wstaw szukaną wartość. Jeśli select nic nie zwróci, to wtedy dodajesz rekord.

Czy może chodzi Ci o takie coś:

$zapytanie = "SELECT * FROM linki WHERE DLUGI_LINK = \"$podany_dlugi_link\"";

A w jaki sposób sprawdzić, czy SELECT nic nie zwróci?

Nie do końca. To co podałaś też zadziała, ale umożliwi atak SQL Injection. Lepiej skorzystać z parametryzacji zapytań: https://www.php.net/manual/en/pdostatement.bindparam.php.

A co do selecta, po prostu robisz fetch, podobnie jak teraz masz. Tu masz jakieś przykłady: https://phpdelusions.net/pdo_examples/select

0
serek napisał(a):
Kaska1988 napisał(a):
serek napisał(a):

Nie rób wyszukiwania w php, zrób to w mysql. Zmień zapytanie na coś w stylu: "SELECT * FROM linki WHERE dlugi_link = :link", a potem skorzystaj z parametryzacji i w miejsce :link wstaw szukaną wartość. Jeśli select nic nie zwróci, to wtedy dodajesz rekord.

Czy może chodzi Ci o takie coś:

$zapytanie = "SELECT * FROM linki WHERE DLUGI_LINK = \"$podany_dlugi_link\"";

A w jaki sposób sprawdzić, czy SELECT nic nie zwróci?

Nie do końca. To co podałaś też zadziała, ale umożliwi atak SQL Injection. Lepiej skorzystać z parametryzacji zapytań: https://www.php.net/manual/en/pdostatement.bindparam.php.

A co do selecta, po prostu robisz fetch, podobnie jak teraz masz. Tu masz jakieś przykłady: https://phpdelusions.net/pdo_examples/select

Dziękuję, chyba działa :) Zerknij tylko proszę na kod, który wykonuję, czy nie robię jakiejś gafy w optymalizacji.

PS. Nie wiem, czy da się rzutować datę, ale na wszelki wypadek przesyłam ją jako string i działa, póki co. Oto kod:

<?php		
	//podejrzyj dane w tabeli
	//require_once "dane_w_tabeli.php";
	$podany_dlugi_link = $_POST["dlugi_link"];
	$skrocony_link = $podany_dlugi_link."_SKROCONY";
	
	$data = date("Y-m-d H:i:s");
	
	$zapytanie = "SELECT * FROM linki WHERE DLUGI_LINK = :podany_dlugi_link";//0
	//echo("Zapytanie to: ".$zapytanie."<br/>");
	
	$rezultat = $handler->prepare($zapytanie);//1
	$rezultat -> bindValue(':podany_dlugi_link', $podany_dlugi_link, PDO::PARAM_STR);//2
	$wynik = $rezultat->execute();//3
	
	
	$wiersz = $rezultat->fetch();
	//print_r($wiersz);
	
	if ($podany_dlugi_link == $wiersz["DLUGI_LINK"]) echo("Link jest już w bazie. Wersja skrócona: ".$wiersz["SKROCONY_LINK"]);
	else 
	{
		$zapytanie = "INSERT INTO LINKI VALUES(null,:podany_dlugi_link,:skrocony_link,:data,0)";
		echo("Zapytanie podawane do mysql: ".$zapytanie."<br/>");
		
		$rezultat = $handler->prepare($zapytanie);//1
		$rezultat -> bindValue(':podany_dlugi_link', $podany_dlugi_link, PDO::PARAM_STR);//2
		$rezultat -> bindValue(':skrocony_link', $skrocony_link, PDO::PARAM_STR);//2
		$rezultat -> bindValue(':data', $data, PDO::PARAM_STR);//2
		$wynik = $rezultat->execute();//3
		
		
		//$rezultat = $handler->query($zapytanie);
		//echo("Zapytanie to: ".$zapytanie."<br/>");
		echo("Dodano<br/>");
	}
	
	$rezultat->closeCursor();//4
	//NIE SZUKAJ W PHP TYLKO W SQL - BEZ WHILE
	
	
	/*while($wiersz = $rezultat->fetch(PDO::FETCH_ASSOC))
	{
		//echo($wiersz["DLUGI_LINK"]."<br/>");
		if ($podany_dlugi_link == $wiersz["DLUGI_LINK"])
		{
			echo("Link jest już w bazie. Wersja skrócona: ".$wiersz["SKROCONY_LINK"]);
			break;//przerwij pętlę jeśli znajdziesz taki rekord
		}
		else
		{
			$zapytanie = "INSERT INTO LINKI VALUES(null,\"$podany_dlugi_link\",\"$podany_dlugi_link _SKROCONY\",\"$data\",0)";
			$rezultat = $handler->query($zapytanie);
			//echo("Zapytanie to: ".$zapytanie."<br/>");
			echo("Dodano<br/>");
			break;
		}
	}*/
?>

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.