Hallo,

Ik heb een klein probleempje met mijn script en weet niet waar het aan ligt..

Ik voer namelijk een INSERT query uit en opzich gaat dat goed. De data komt in de database maar om een 1 of andere reden returnt hij toch false. Hier is de code met de query:

if (! isset($error)) {
		$insert_q = "INSERT INTO `GUESTBOOK_entries` (name, email, website, message, date, ip) VALUES ('".addslashes($name)."','".addslashes($email)."','".addslashes($website)."','".addslashes($message)."',NOW(),'".$_SERVER['REMOTE_ADDR']."')";
		$postentry = $db->Query($insert_q);
	}


En aangezien ik zelf een MySQL class heb geschreven, ook nog de code uit de method Query :P

public function Query($sql) {
		$this->ResetError();
		$this->last_sql = $sql;
		$this->last_result = @mysql_query($sql, $this->mysql_link);
		if(! $this->last_result) {
			$this->active_row = -1;
			$this->SetError();
			return false;
		} else {
			if (strpos(strtolower($sql), "insert") === 0) {
				$this->last_insert_id = mysql_insert_id();
				if ($this->last_insert_id === false) {
					$this->SetError();
					return false;
				} else {
					$numrows = 0;
					$this->active_row = -1;
					return $this->last_result;
				}
			} else if(strpos(strtolower($sql), "select") === 0) {
				$numrows = mysql_num_rows($this->last_result);
				if ($numrows > 0) {
					$this->active_row = 0;
				} else {
					$this->active_row = -1;
				}
				$this->last_insert_id = 0;
				return $this->last_result;
			} else {
				return $this->last_result;
			}
		}
	}


Ik denk zelf dat het ergens in de function fout gaat, maar de query voert dus wel goed uit... weet iemand waar het aan kan liggen?

Alvast bedankt!

~ Bart
1. backticks horen niet thuis in sql
2. het is ook niet handig om hoofdletters en kleine letters doorelkaar te gebruiken bij het benoemen van database/tabel/veldnamen
3. onderdruk geen fout, dus haal die @ uit je code
4. niet goed is bij jou niet fout, m.a.w. schrijf nette duidelijk foutafhandeling
5. addslashes, het moet niet gekker worden, je dient op die plek _real_escape_string te gebruiken
6. zet geduren het testen van je code de debug modus aan, zodat je de pijn punten van je code te zien krijgt
1. Ik hoorde juist dat je die wel moest gebruiken om eventuele reserved keywords te omzeilen?
2. Misschien heb je daar gelijk in, maar ik gebruikte het vooral voor mijzelf zodat ik bijvoorbeeld snel kan zien bij welk component de tabel hoort.
3. Ik handel de fouten af op mijn eigen manier. Ik heb de $db->SetError() voor het opvangen van fouten, en kan ze (desnoods afgeschermd voor normaal publiek) zien met $db->Error(). Echter geeft hij in dit geval geen MySQL error terug...
4. Waar in de code zie je dat?
5. Weet ik, alleen op een een of andere reden doet mysql_real_escape_string() het niet op mijn host.. :/
6. Dat kan ik nog wel eens proberen.. Heb tot nu toe alleen een var_dump voor $postentry die me informatie geeft.. :P
Reserved words gebruiken in tabel of attribuutnamen is onverstandig. Om dat daarna dan weer te omzeilen met backticks of quotes is onhandig. Kortom doe niet! Upper en lower case door elkaar is ook niet handig in bijv GUESTBOOK_entries, niet doen! Wil je graag de tabelnaam erbij zien prefix dan gewoon: guestbook.entries ipv GUESTBOOK_entries. Onderduk nooit fouten met @ en een verdediging van "Ik handel de fouten af op mijn eigen manier" is een illusie, @ gebruiken onderdukt foutmeldingen dus die kan je ook niet op je eigen manier afhandelen. Neem gewoon even aan wat Noppes zegt ipv alles te verdedigen!!
Ok, ik begrijp het. Het is misschien een beetje onhandig inderdaad.. maar zo heb ik het aangeleerd helaas.. :/

Ik heb de backticks verwijdered uit de query en zal dat ook bij de rest doen (voor zover ik weet gebruik ik inderdaad toch geen reserved keywords). De uppercase wordt wat moeilijker om direct aan te passen aangezien ik dan meteen mijn hele database moet omgooien..

Mijn excuses. Ik wou niemand aanvallen of zo, en ik sta open voor alle advies, begrijp dat niet verkeerd. Ik zie en lees alleen zo veel verschillende manieren dat het moeilijk is om daar de beste manier uit te halen..
Excuses niet nodig hoor, niemand voelt zich aangevallen. Haal alle backticks en @ weg en zet foutmeldingen aan zolang je aan het testen ben:

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
?>

Ongetwijfeld zie je dan sneller wat er fout gaat. Later kan je de foutmeldingen onzichtbaar maken voor de gebruiker.
Ik krijg deze errors terug:

Deprecated: Function eregi() is deprecated in webscripts/WEBSITE_gastenboek.php on line 27

Warning: mysql_insert_id() [function.mysql-insert-id]: Access denied for user '<snip>'@'localhost' (using password: <snip>) in classes/class.mysql.php on line 176

Warning: mysql_insert_id() [function.mysql-insert-id]: A link to the server could not be established in classes/class.mysql.php on line 176


Volgens mij zijn die warnings de reden waarom mijn function "false" returned... alsof de rechten niet goed zijn of zo lijkt het..
Maak eens van mysql_insert_id() dit: mysql_insert_id($this->mysql_link)
Heb het veranderd en nu doet hij het wel! Hij geeft nu wel gewoon "true" terug, wat de bedoeling was. bedankt voor de hulp allemaal! :D

Reageren