PDO Statements

McMay

Mitglied
Hallo, ich versuche gerade meine Skripts auf PDO umzustellen, bekomme jedoch Probleme, wenn ich das Ergebnis einer Abfrage validieren will.

Hier ist der Code, den ich unter php4 verwendet habe:
PHP:
function check_user( $name, $pass ){
	$sql = 'SELECT CustomerID FROM Customer WHERE User =\''.$name.'\' AND Password = \''.md5($pass).'\'';
	if (!$result=mysql_query($sql)){
		die ( mysql_error());
	}
	if ( mysql_num_rows ($result) == 1 ) {
		$user = mysql_fetch_assoc($result);
		return ($user['CustomerID']);

	}else{
		return (false);
	}
}
Mir kommt es darauf an ob mysql_num_rows == 1 ist.

Jetzt versuche ich das ganze mit pdo-statementes, aber hier bekomme ich immer einen Fehler, bzw. weiß ich nicht, wie ich das Ergebnis der Select Abfrage nach genau einem DS abfragen kann. Hier mein Code:
PHP:
function check_user( $name, $pass ){
	try{
		$conn = db_connect();
		$stmt = $conn->prepare('SELECT CustomerID FROM `Customer` WHERE `User` = ? and Password = ?');
		$stmt->bindParam(1,$name);
		$stmt->bindParam(2,md5($pass));
		$stmt->execute();
		$result = $stmt->columnCount();
		if ($result == 1) {
			$user = $stmt->fetch(PDO::FETCH_ASSOC);
			return ($user['CustomerID']);
		}else {
			return (false);
		}
	}
	catch(PDOException $e){
		print "Error:<br>".$e->getMessage()."<br/>";
		die();
	}
Ich hatte auch versucht statt $result = $stmt->columnCount(); rowCount() zu benutzen, jedoch funktioniert das auch nicht wie gewünscht.
Es ging zwar lokal aber als ich die Skripte auf dem Server probierte, bekam ich kein Ergebnis aus der Abfrage.
Wo liegt mein Denkfehler. Bin noch ziemlich neu mit pdo.
Wie kann ich meinen Code richtig umschreiben?
THX
 
Wenn es lokal ging und auf dem Server nicht, hast du mal geschaut ob die selben PHP-Module installiert sind?
 
Naja column count wird dir wenn das query mehr als einen datensatz gefunden hat immer 1 zurückgeben. Ich weiss nicht ob das wirklich das ist was du willst. Ich denke du willst eher sicher gehen das genau ein Datensatz gefunden wurde.
Von daher wäre rowCount die bessere Wahl.
Zu rowCount bei select statements gibt es aber keine garantie was das erwartete Verhalten angeht: http://de2.php.net/manual/en/function.PDOStatement-rowCount.php

musst es wohl anders machen.
eine von vielen Möglichkeiten dein Problem zu lösen wäre:

PHP:
function check_user( $name, $pass ){
    try{
        $conn = db_connect();
        $stmt = $conn->prepare('SELECT  SQL_CALC_FOUND_ROWS CustomerID FROM `Customer` WHERE `User` = ? and Password = ?');
        $stmt->bindParam(1,$name);
        $stmt->bindParam(2,md5($pass));
        $stmt->execute();
        $result= $con->query('SELECT FOUND_ROWS()');
        $row_count = $result->fetchColumn(0);
        if ($row_count== 1) {
            $user = $stmt->fetch(PDO::FETCH_ASSOC);
            return ($user['CustomerID']);
        }else {
            return (false);
        }
    }
    catch(PDOException $e){
        print "Error:<br>".$e->getMessage()."<br/>";
        die();
    }

Bur ein Vorschlag auf die schnelle. Kannst es natürlich auch mit count etc. machen.

MFG

Shrink
 
Das hatte ich auch in der Doku gelesen.
Ich hatte mich nur gefragt, ob es nicht doch eine einfachere Lösung gibt, mit nur einer SQL-Abfrage.
 
Ich habe so einige select Abfragen in meinem Skript. Muss ich also immer mit einer doppelten SQL Abfrage arbeiten, wenn ich wissen will ob nur ein DS betroffen ist?
 
So, ich brauche nochmal eure Hilfe.
Ich habe den Code jetzt folgendermaßen geändert:
PHP:
function check_user( $name, $pass ){
	try{
		$conn = db_connect();
		$stmt = $conn->prepare('SELECT CustomerID FROM `Customer` WHERE `User` = ? and Password = ?');
		$stmt->bindParam(1,$name);
		$stmt->bindParam(2,md5($pass));
		$stmt->execute();
		$result = $conn->query('SELECT FOUND_ROWS()');
		$row_count = $result->fetchColumn(0);
		if ($row_count == 1) {
			$user = $stmt->fetch(PDO::FETCH_ASSOC);
			return ($user['CustomerID']);
		}else {
			return (false);
		}
	}
	catch(PDOException $e){
		print "Error:<br>".$e->getMessage()."<br/>";
		die();
	}

läuft lokal auch wunderbar, aber wenn ich mich auf dem Server einloggen möchte erhalte ich folgende Fehlermeldung:

Fatal error: Call to a member function fetchColumn() on a non-object in ...

Was ist denn jetzt wieder los?
 
Noch ein Zusatz:
Wenn ich LOKAL echo var_dump($result) aufrufe, bekomme ich folgendes Ergebnis:
HTML:
object(PDOStatement)#3 (1) { ["queryString"]=>  string(19) "SELECT FOUND_ROWS()" }
und bei echo var_dump($row_count) das hier:
HTML:
 string(1) "1"

Wenn ich das ganze jetzt auf dem Server laufen lasse bekomme ich bei var_dump($result) nur bool(false) ausgegeben und danach die Fehlermeldung von oben.

Hier komme ich einfach nicht weiter. Keine Ahnung wo ich suchen muss.
Bin gerade zu webhoster.de gewechselt. Kann man da an der php.ini irgendetwas einstellen?

THX
 
Hast du mal das gemacht was secius vorgeschlagen hat?
Wenn auf dem Server nicht vorhanden, mach dir ne phpinfo.php und check mal was für Treiber PDO auf deinem Server unterstützt.
 
Habe ich schon mal nachgesehen. Scheinen mir beide (lokal und serverseitig) gleich zu sein.
Ich poste mal was dort für PDO steht
lokal:
HTML:
PDO
PDO support	enabled
PDO drivers 	mysql, sqlite, sqlite2

pdo_mysql
PDO Driver for MySQL, client library version	5.0.26

und beim Server habe ich:
HTML:
PDO
PDO support	enabled
PDO drivers 	mysql, odbc, pgsql, sqlite

pdo_mysql
PDO Driver for MySQL, client library version	5.0.22

Ich kann bei meinem Webhoster ein paar php.ini Einstellungen selber vornehmen. Nur weiß ich noch nicht genau wozu die gut sind und ob das das Problem vielleicht lösen könnte.
Hier die Möglichkeiten, vielleicht kann mich da ja jemand beraten.
HTML:
PHP safe_mode
PHP register_globals
PHP open_basedir
WebServer mod_rewrite
PHP default_charset
PHP memory limit
PHP upload file size
PHP call_time_pass_reference
PHP magic_quotes_gpc
PHP register_long_arrays
PHP session_save_path
PHP url_fopen

Vielen Dank für Eure Hilfe
 
Zurück