ugrás a tartalomhoz

Email címek összehasonlítása

derbyday · 2013. Dec. 17. (K), 17.39
Sziasztok!

Feliratkozó panelt készítek az a feliratkozott email címeket MySQL adatbázisban tárolom. Azt szeretném, hogy ha valaki már feliratkozott egy email címmel akkor azt ne tudja megtenni még egyszer. A gondom az, hogy eltárolom változóban az éppen aktuális email címet és az adatbázisból kinyert email címet. De ahogy megfigyeltem az adatbázisból kinyert változó nem kap értéket így az összehasonlítás nem működik.

Előre is köszönöm a segítségeteket és a válaszaitokat!

<?php
session_start();
header("Content-Type: text/html; charset=utf-8");
  if (isset($_POST["subscribe"])){
    if (strtolower($_POST["captcha_code"]) !== $_SESSION["captcha"]){
      echo "Sajnáljuk de, hibás biztonsági kódot adtál meg, így a feliratkozásod nem sikerült. " . "<br>\n" . "Visszairányítunk a Főoldalra...";
	  header("HTTP/1.1 301 Moved Permanently");
	  header("refresh: 5; url = ../fooldal.php#subscriptionRequest");
	  exit; //Captcha ellenőrzés.
    } else {	
      echo "Helyes biztonsági kód!" . "<br>\n";	

$databaseHost = 'localhost'; //A tárhelyen nem ezek az adatok vannak!!!
	$databaseUser = 'root';
	$databasePass = 'stereo92';
	$databaseName = 'nargaron';
	$connection = mysqli_connect($databaseHost, $databaseUser, $databasePass, $databaseName)or die 
('...nem sikerült, mert nem tudtunk csatlakozni az adatbázishoz.' . "<br>\n" . 'Megkérünk, hogy írj egy hibajelentést a Webmesterünknek a Kontakt oldalon.' . "<br>\n" .  'Átirányítunk a Főoldalra...');
$connection->query('SET NAMES utf8');
		$mail_to = $_POST['email'];
		$sql = "SELECT email FROM subscription WHERE email='" . $mail_to . "'";
		$query = $connection->query($sql);
		$result = $query->fetch_assoc();
		/*echo $result;
		echo $mail_to;*/
		if ($result == $mail_to) {
      echo "Úgytűnik ezzel az email címmel (" . "<strong>" . $mail_to . "</strong>" . ") már regisztráltak. Nem te voltál :-)? Ha nem, akkor megkérünk, hogy írj egy hibajelentést a Webmesterünknek." . "<br>\n" . "Visszairányítunk a Főoldalra...";
	  header("HTTP/1.1 301 Moved Permanently");
	  header("refresh: 5; url = ../fooldal.php#subscriptionRequest");
$connection->close();
		exit;
		} else {
			
		$connection->close();
		
		$subject = 'Närgaron - Feliratkozás visszaigazolása' . "\n";
		$body_message = 'Feladó neve: Närgaron Webmester' . "\n";
		$body_message .= 'Feladó email címe: noreply##kukac##nargaron.hu' . "\n";
		$body_message .= 'Üzenet: ' . "<br>\n" .
		'Kedves Feliratkozó!' . "<br>\n" 
		. "\n" .  
		'Ezúton is szeretnénk megköszönni a feliratkozásodat. Reméljük, hogy tartalmas hírekkel tudunk szólgálni. Ám még nem vagyunk készen. Ha mégsem szeretnél feliratkozni zenekarunk hírlevelére akkor ezt a levelet, hagyd figyelmen kívül. Azonban ha valóban szeretnél feliratkozni akkor az alábbi linkre kell kattintanod.' . "<br>\n" . "<br>\n" .
		'http://www.nargaron.hu/hu/backend/feliratkozas.php' . "\n" . "<br>\n" .
		'Köszönettel,' . "\n" . 
		'Närgaron webmestere';
		$mail = mail($mail_to, $subject, $body_message);
		}
	   if ($mail) { 
	   echo  "A megadott email címedre küldtünk egy visszaigazoló emailt! Köszönjük!" . "<br>\n" . "Visszairányítunk a Főoldalra...";
	   header("HTTP/1.1 301 Moved Permanently");
	   header("refresh: 8; url = ../fooldal.php#subscriptionRequest");
exit;
	} else {
	echo "A feliratkozás nem sikerült!" . "<br>\n" . " Ha ez a hiba nem szűnik meg, kérlek írj egy hibajelentést a Kontakt oldalunkon. Köszönjük!" . "<br>\n" . "Visszairányítunk a Főoldalra...";
	 ;
	header("HTTP/1.1 301 Moved Permanently");
	header("refresh: 8; url = ../fooldal.php#subscriptionRequest");
	exit;
    exit;
		}}
?>
utóirat: Nem vagyok még igazán profi a témában, csak tanulom a nyelvet :-).
 
1

array mysqli_result::fetch_assoc ( void )

T.G · 2013. Dec. 17. (K), 18.03
http://www.php.net/manual/en/mysqli-result.fetch-assoc.php

Ennek a függvénynek az eredménye nem egy darab string, hanem egy asszociatív tömb.

var_dump($result);
2

Köszi! Beillesztettem a

derbyday · 2013. Dec. 18. (Sze), 17.26
Köszi!

Beillesztettem a kódot, amit írtál 's most NULL értéket adott vissza... ez mitől lehet?

Most így néz ki a kódom:

	$databaseHost = 'localhost'; //A tárhelyen nem ezek az adatok vannak!!!
	$databaseUser = 'root';
	$databasePass = 'stereo92';
	$databaseName = 'nargaron';
	$connection = mysqli_connect($databaseHost, $databaseUser, $databasePass, $databaseName)or die 
('...nem sikerült, mert nem tudtunk csatlakozni az adatbázishoz.' . "<br>\n" . 'Megkérünk, hogy írj egy hibajelentést a Webmesterünknek a Kontakt oldalon.' . "<br>\n" .  'Átirányítunk a Főoldalra...');
$connection->query('SET NAMES utf8');
		$mail_to = $_POST['email'];
		$sql = "SELECT email FROM subscription WHERE email='" . $mail_to . "'";
		$query = $connection->query($sql);
		$result = $query->fetch_assoc();
		var_dump($result);
/*echo $result;
		echo $mail_to;*/
		if ($result == $mail_to) {
      echo "Úgytűnik ezzel az email címmel (" . "<strong>" . $mail_to . "</strong>" . ") már regisztráltak. Nem te voltál :-)? Ha nem, akkor megkérünk, hogy írj egy hibajelentést a Webmesterünknek." . "<br>\n" . "Visszairányítunk a Főoldalra...";
	  header("HTTP/1.1 301 Moved Permanently");
	  header("refresh: 5; url = ../fooldal.php#subscriptionRequest");
3

if (!is_null(...

T.G · 2013. Dec. 18. (Sze), 17.44
Teszteld le azt, amikor ismétlődő email címet adsz meg és azt is, amikor újat.
És ennek megfelelően alakítsd a feltételt.
(az előző hozzászólásomban belinkelt oldalon a mintapéldák is sokat segítenek ám:)
4

Ha új email címet adok meg

derbyday · 2013. Dec. 18. (Sze), 18.55
Ha új email címet adok meg akkor is NULL az érték és ha egy az adatbázisban szereplő email címet akkor is NULL az érték. Hogy kéne módosítani a kódot? Nem igazán találtam számomra érthető segítséget :S. Úgy veszem ki, hogy jól csináltam a dolgot, de mégse...
5

debugolás...

T.G · 2013. Dec. 18. (Sze), 23.24
A kód elejére írd ezt be:

ini_set('display_errors', true);
error_reporting(E_ALL);
illetve írasd ki a $sql változót is akkor, amikor elvileg olyan lekérés van, ahol kellene visszaadnia értéket, ezt az sql utasítást ellenőrizd pl. phpMyAdmin-ban, hogy valóban add-e vissza értéket?
6

Beillesztettem az általad írt

derbyday · 2013. Dec. 19. (Cs), 18.22
Beillesztettem az általad írt kódot, azonos email címmel próbálkoztam és a következőket kaptam.

$sql kiírás esetén:

Helyes biztonsági kód!
SELECT email FROM subscription WHERE email='info##kukac##nargaron.hu'array(1) { ["email"]=> string(16) "info##kukac##nargaron.hu" } A megadott email címedre küldtünk egy visszaigazoló emailt! Köszönjük!
Visszairányítunk a Főoldalra...

$query kiírás esetén:

Helyes biztonsági kód!
Catchable fatal error: Object of class mysqli_result could not be converted to string in D:\Programs\XAMPP\htdocs\Nargaron-weblap-(PHP)\hu\backend\kuld-feliratkozas.php on line 56

Itt a program nem is futott tovább. Ha jól veszem ki nem tudja átalakítani a tömböt Stringgé. Vagy tévedek?
7

null ? tömb

T.G · 2013. Dec. 19. (Cs), 23.42
Tehát, ha ismétlődő címet írsz, akkor mégsem null lesz az érték, hanem egy tömb?
8

Ha nem ismétlődő email

derbyday · 2013. Dec. 20. (P), 08.15
Ha nem ismétlődő email címekkel próbálkozom, akkor is ugyanezeke az eredményeket kapom... :S

Egy olyat megpróbáltam, hogy a $query-t var_dumpoltam és azt hasonlítottam össze a $mail_to-val. A program lefutott, de nem hibásan.

Hasonló email cím esetén:

Helyes biztonsági kód!
object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(1) ["lengths"]=> NULL ["num_rows"]=> int(1) ["type"]=> int(0) } A megadott email címedre küldtünk egy visszaigazoló emailt! Köszönjük!
Visszairányítunk a Főoldalra...

Másik email cím esetén:

Helyes biztonsági kód!
object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(1) ["lengths"]=> NULL ["num_rows"]=> int(0) ["type"]=> int(0) } A megadott email címedre küldtünk egy visszaigazoló emailt! Köszönjük!
Visszairányítunk a Főoldalra...

Ezeket már nem igazán tudom értelmezni. Nekem úgy tűnik, mintha semminek nem lenne értéke...
9

találatok száma

Poetro · 2013. Dec. 20. (P), 09.54
Mint látod, a második találat 0 találatot adott vissza, ezért ha lekérdezed az első sort a találatok közül, akkor null-t kapsz.
10

Itt a num_rows értékéből

Endyl · 2013. Dec. 20. (P), 09.58
Itt a num_rows értékéből látszik, hogy az egyik esetben van egyező sor, míg a másikban nincs. Ebből is látszik, hogy ha megadod a lekérdezésben az email-címet, akkor felesleges erre még egyszer tesztelni php oldalon is, hanem elegendő lehet a mysqli_result objektum num_rows mezőjét megnézni, ami ha nagyobb mint nulla, akkor van találat, ellenkező esetben meg még nem szerepel az adott cím az adatbázisban.
11

Sikerült, köszönöm szépen a

derbyday · 2013. Dec. 20. (P), 10.40
Sikerült, köszönöm szépen a segítséget!

Végül ez lett a megoldás:

...
$mail_to = $_POST['email'];
$sql = "SELECT email FROM subscription WHERE email='" . $mail_to . "'";
		$query = $connection->query($sql);
		$result = $query->num_rows;
		if ($result > 0) {
      echo "Úgytűnik ezzel az email címmel (" . "<strong>" . $mail_to . "</strong>" . ") már regisztráltak. Nem te voltál :-)? Ha nem, akkor megkérünk, hogy írj egy hibajelentést a Webmesterünknek." . "<br>\n" . "Visszairányítunk a Főoldalra...";
	  header("HTTP/1.1 301 Moved Permanently");
	  header("refresh: 5; url = ../fooldal.php#subscriptionRequest");
...
Még egyszer nagyon szépen köszönöm a segítségeteket! :)
12

Új problémával kerültem

derbyday · 2013. Dec. 20. (P), 22.13
Új problémával kerültem szembe. A kódomat feltöltöttem a tárhelyemre ahol természetesen már nem akart működni, számos hiba miatt. Ezeket kijavítottam, de ezt az egyet nem sikerült, így az email cím ellenőrzés, amiben segítetteket végeredményben nem működik. Ezt a hiba üzenetet kapom:

Notice: Trying to get property of non-object in /home/nargnhu1/public_html/hu/backend/kuld-feliratkozas.php on line 59

Így néz ki az érintett forráskódom:

...
	$databaseHost = 'server11.mysql-host.eu';
	$databaseUser = 'nargnhu1_user';
	$databasePass = 'stereo1992';
	$databaseName = 'nargnhu1_nargaron1';
	$connection = mysqli_connect($databaseHost, $databaseUser, $databasePass, $databaseName)or die 
('...nem sikerült, mert nem tudtunk csatlakozni az adatbázishoz.' . "<br>\n" . 'Megkérünk, hogy írj egy hibajelentést a Webmesterünknek a Kontakt oldalon.' . "<br>\n" .  'Átirányítunk a Főoldalra...');
$connection->query('SET NAMES utf8');
		$mail_to = $_POST['email'];
		$sql = "SELECT email FROM subscription WHERE email='" . $mail_to . "'";
		$query = $connection->query($sql);
		$result = $query->num_rows; //ERRE A SORRA MUTAT!
		if ($result > 0) {
      echo "Úgytűnik ezzel az email címmel (" . "<strong>" . $mail_to . "</strong>" . ") már regisztráltak. Nem te voltál :-)? Ha nem, akkor megkérünk, hogy írj egy hibajelentést a Webmesterünknek." . "<br>\n" . "Visszairányítunk a Főoldalra...";
$connection->close();
		exit;
} else {
			
		$connection->close();
		$subject = 'Närgaron - Feliratkozás visszaigazolása' . "\n";
		$body_message = 'Feladó neve: Närgaron Webmestere' . "\n";
		$body_message .= 'Feladó email címe: noreply##kukac##nargaron.hu' . "\n";
		$body_message .= "\n" .  
		'Kedves Feliratkozó!' . "\n" 
		. "\n" .  
		'Ezúton is szeretnénk megköszönni a feliratkozásodat. Reméljük, hogy tartalmas hírekkel tudunk szólgálni. Ám még nem vagyunk készen. Ha mégsem szeretnél feliratkozni zenekarunk hírlevelére akkor ezt a levelet, hagyd figyelmen kívül. Azonban ha valóban szeretnél feliratkozni akkor az alábbi linkre kell kattintanod.' . "\n" . "\n" .
		'http://www.nargaron.hu/hu/backend/feliratkozas.php' . "\n" . "\n" .
		'Köszönettel,' . "\n" . 
		'Närgaron webmestere';
		
		$mail = mail($mail_to, $subject, $body_message);
		}
	   if ($mail) { 
	   echo  "A megadott email címedre (" . "<strong>" . $mail_to . "</strong>" . ") küldtünk egy visszaigazoló emailt! Köszönjük!" . "<br>\n" . "Visszairányítunk a Főoldalra...";
...
Nem igazán sikerült megértenem, hogy mi lehet a gond...
Előre is köszi a segítségeteket!
13

Jó kérdés

Pepita · 2013. Dec. 21. (Szo), 00.51
Remélem a kapcsolódási adatok nem a valódiak!!! Ilyet sose adj meg kódidézetben!

A hibaüzi azt jelenti, hogy a $query erőforrás nem objektum. Hogy miért, az jó kérdés, kéne vadászni egy SQL error-t is (pl. echo(mysqli_error($connection));), biztos van valami hiba a lekérdezésben, emiatt a $query = null, tehát nem objektum.
Hogy otthon miért műxik, kérdezd az otthoni szervert... Ilyenkor érdemes az összes beállításbeli különbséget végigbogarászni. Az SQL szerver verzió legalább azonos?
14

Viszont ha valódiak, akkor

bamegakapa · 2013. Dec. 21. (Szo), 02.31
Viszont ha valódiak, akkor igen gyorsan változtasd meg az adatbázis jelszavadat.
15

Jogosultságok

derbyday · 2013. Dec. 21. (Szo), 10.52
Egészen hülye probléma volt. A felhasználómnak nem volt jogosultsága a SELECT-hez, ezért nem kapott értéket a $query.

Köszi a segítséget! Egyébként voltam olyan hülye és sajnos valódi adatok voltak, nem figyeltem őket. De már megváltoztattam! :)

Még egyszer köszi a segítséget!
16

A lényeg, hogy meg van a hiba,

Pepita · 2013. Dec. 21. (Szo), 12.19
mindenki hibázik, nem vagy ettől még hülye, de amit itt kiírsz, az van olyan nyilvános, mintha egy TV reklámban menne le...
Szóval jelszóval vigyázz legközelebb, de szerintem most megtanultad egy életre... :)
Örülök, hogy csak beállítási gond volt, igyekszem is megjegyezni, mert közvetlenül erre is gondolhattam volna. Ezért jó, ha a megoldást is kiírod, köszi én is.
17

Nincs mit :)!

derbyday · 2013. Dec. 21. (Szo), 13.01
Nincs mit :)!