PHP Prepared Statement

thepro1

Lt. Junior Grade
Registriert
Apr. 2008
Beiträge
411
Hallo liebe Community,

ich bekomme beim ausführen von folgendem Code:

PHP:
// Verbindung zur DB herstellen
	require('db_verbindung.php');
	
	// Prepared Statement anlegen
	$stmt = $db_connection->prepare("insert into `tab_gaestebuch` (name,vorname,email,homepage,inhalt,freigegeben) values (:nachname,:vorname,:email,:homepage,:text,1)");

	$stmt->bindParam(':nachname', $nachname);
	$stmt->bindParam(':vorname', $vorname);
	$stmt->bindParam(':email', $email);
	$stmt->bindParam(':homepage', $homepage);
	$stmt->bindParam(':text', $text);
	
	// eine Zeile einfügen
	$nachname = $_GET['nachname'];
	$vorname = $_GET['vorname'];
	$email = $_GET['email'];
	$homepage = $_GET['homepage'];
	$text = $_GET['text'];
	
	// Statement abschicken
	$stmt->execute();

folgenden Fehler:
Fatal error: Call to a member function bindParam() on a non-object in C:\xampp\htdocs\Dropbox\Dev\Webdesign\franzwirth\pferd-koppel.de\gb_in_db_eintragen.php on line 9

ich habe mich durch mehrere Foren geschlagen und den Fehler auch öfters gefunden.
Leider hat es nichts gebracht... :(

Hat jemand eine Idee?
 
entweder
Code:
$para = array(':nachname' => $_GET['nachname'], ':vorname' =>.....);
$stmt->execute($para);

oder:
Code:
$stmt->bindParam('nachname', $nachname);
$stmt->bindParam('vorname', $vorname); ...

afaik ist bei einem einfachen bind kein :name erlaubt
 
@imRa: "Call to a member function bindParam() on a non-object" hat nichts mit den parametern zu tun. $stmt ist einfach kein objekt! der sql insert enthält vermutlich einen fehler.

merke: du solltest immer auf $stmt !== false prüfen bevor du das objekt verwendest. die fehlerbehandlung ist enorm wichtig!
 
@IceMatrix
Super danke :) ich habe jetzt allerdings einen neuen unerklärlichen fehler? :(
PHP:
<?php

	// Verbindung zur DB herstellen
	require('db_verbindung.php');
	
	// Prepared Statement anlegen
	$stmt = $db_connection->prepare("insert into `tab_gaestebuch` (name,vorname,email,homepage,inhalt,freigegeben) values (':nachname',':vorname',':email',':homepage',':text',1)");

	if ($stmt !== false){
		$stmt->bindParam(':nachname', $nachname);
		$stmt->bindParam(':vorname', $vorname);
		$stmt->bindParam(':email', $email);
		$stmt->bindParam(':homepage', $homepage);
		$stmt->bindParam(':text', $text);
		
		// eine Zeile einfügen
		$nachname = $_GET['nachname'];
		$vorname = $_GET['vorname'];
		$email = $_GET['email'];
		$homepage = $_GET['homepage'];
		$text = $_GET['text'];
		
		// Statement abschicken
		$stmt->execute();
	}
	else{
		echo "Fehler im SQL-Statement<br />";
	}
 
PHP:
        $stmt->bindParam(':nachname', $nachname);
        $stmt->bindParam(':vorname', $vorname);
        $stmt->bindParam(':email', $email);
        $stmt->bindParam(':homepage', $homepage);
        $stmt->bindParam(':text', $text);
        
        // eine Zeile einfügen
        $nachname = $_GET['nachname'];
        $vorname = $_GET['vorname'];
        $email = $_GET['email'];
        $homepage = $_GET['homepage'];
        $text = $_GET['text'];

Das hier ist die falsche Reihenfolge. bindParam ist Call by Value, nicht Call by Reference!


Die Fehlermeldung solltest du (nur zum Debuggen!) mit der eigentlichen Fehlermeldung der Datenbank erweitern. Die kriegst du über

$db_connection->errorInfo() oder $db_connection->errorCode()

http://www.php.net/manual/de/pdo.errorinfo.php
http://www.php.net/manual/de/pdo.errorcode.php
 
Stimmt du hast Recht.. Dennoch würde ich bindValue bevorzugen weil die Zuweisungen und Dereferenzierungen hier konkret nur Overhead sind.
 
PHP:
<?php

    // Verbindung zur DB herstellen
    require('db_verbindung.php');
    
    // Prepared Statement anlegen
    $stmt = $db_connection->prepare("insert into `tab_gaestebuch` (name,vorname,email,homepage,inhalt,freigegeben) values (':nachname',':vorname',':email',':homepage',':text',1)");
    
    if ($stmt !== false){
	
	$stmt->bindValue(':nachname', $_GET['nachname'], PDO::PARAM_STR);
	
        // Statement abschicken
        $stmt->execute();
    }
    else{
	echo "Fehler im SQL-Statement<br />";
    }

ich habe das mit dem bindValue jetzt mal so verstanden, ich bekomme aber vom Prinzip her die gleiche Fehlermeldung....

Fatal error: Call to undefined method mysqli_stmt::bindValue() in C:\...\file.php on line 11
 
Hallo,

Das mysqli_stmt Objekt, hat keine Funktion Namens BindValue, Die Beiträge bezogen sich darauf, dass du den Inhalt der Variablen erst nach dem bind_param festelgst, so wie es vorher war es eigentlich richtig. Was genau war denn die Fehlermeldung, nachdem du auch $stmt überprüfst?
 
Ich hatte bei diesem Code:
PHP:
<?php

    // Verbindung zur DB herstellen
    require('db_verbindung.php');
    
    // Prepared Statement anlegen
    $stmt = $db_connection->prepare("insert into `tab_gaestebuch` (name,vorname,email,homepage,inhalt,freigegeben) values (':nachname',':vorname',':email',':homepage',':text',1)");

    if ($stmt !== false){
        $stmt->bindParam(':nachname', $nachname);
        $stmt->bindParam(':vorname', $vorname);
        $stmt->bindParam(':email', $email);
        $stmt->bindParam(':homepage', $homepage);
        $stmt->bindParam(':text', $text);
        
        // eine Zeile einfügen
        $nachname = $_GET['nachname'];
        $vorname = $_GET['vorname'];
        $email = $_GET['email'];
        $homepage = $_GET['homepage'];
        $text = $_GET['text'];
        
        // Statement abschicken
        $stmt->execute();
    }
    else{
        echo "Fehler im SQL-Statement<br />";
    }
Diese Fehlermeldung:
Fatal error: Call to undefined method mysqli_stmt::bindParam() in C:\...\file.php on line 10

PS: Line 10: $stmt->bindParam(':nachname', $nachname);
 
Versuch mal das....

PHP:
        $nachname = $_GET['nachname'];
        $vorname = $_GET['vorname'];
        $email = $_GET['email'];
        $homepage = $_GET['homepage'];
        $text = $_GET['text'];

///dann, dass
        $stmt->bindParam(':nachname', $nachname);
        $stmt->bindParam(':vorname', $vorname);
        $stmt->bindParam(':email', $email);
        $stmt->bindParam(':homepage', $homepage);
        $stmt->bindParam(':text', $text);

Denn bei Methoden und Funktionen werden keine Referenzen nachhaltig übergeben, da diese Methoden/Funktionen schon ausgeführt wurden! Es ist ein kompletter Unfug im Sprachdesign wenn sowas vorkommen wurde.

ALA BSP in C#

Code:
class coord{
    public int x;
    public int y;

    public coord(int x, inty)...

    public String ToString()
    {
        return String.Concate("x: ",this.x,"\r\n y: ", y);
    }
}

static void Main(Object args[] e)
{
    int x = 0;
    int y = 0;
    var a = new class coord(x,y);
    console.writeline(a);
    x = 10;
    y = 10;
    console.writeline(a);
}

Dann bekommest du in der erste ausgabe
x: 0
y: 0
und in der zweite auch

auch wenn du es als referenz übergibst, du arbeitest letztendlich mit eine Kopie des Objekts in der Klasse und nicht mit dem Objekt selbst.
 
Wie Trainmaster schon anzumerken versuchte: In der Klasse mysqli_stmt heißt die Methode nicht bindParam, sondern bind_param. (bindParam heißt es im PdoStatement - fiese Falle :D)
 
Super, vielen Dank :) das hat mir jetzt weitergeholfen :)
Fehler behoben :) ==> Nächster Fehler: Fehler im SQL-Statement
Aber das muss ich jetzt selbst hinbekommen :D
Ergänzung ()

So, jetzt bin ich nochmal hier.
Ich sitze jetzt seit ca. 3 Stunden an einem weiteren Problem:

Er meckert immer an der Anzahl meiner Variablen rum, ich verstehe es nicht...
PHP:
// Verbindung zur DB herstellen
    require('db_verbindung.php');
    
    // Prepared Statement anlegen
    $stmt = $db_connection->prepare("insert into `tab_gaestebuch` (name,vorname,email,homepage,inhalt,freigegeben) values (?,?,?,?,?,?)");

    if ($stmt !== false){
	
	// Zuweisung der Variablen
	$stmt->bind_param('BindParameters',$nachname, $vorname, $email, $homepage, $text, $frei);
	
	// Definition der Variablen
        $nachname = $_GET['nachname'];
        $vorname = $_GET['vorname'];
        $email = $_GET['email'];
        $homepage = $_GET['homepage'];
        $text = $_GET['text'];
	$frei = 1;
			
        // Statement abschicken
        $stmt->execute();
	
	// Verbindung und Statement schliessen
	$stmt->close();
	
    }
    else{
        echo "<br />:P Fehler im SQL-Statement :P bzw. stmt ist kein Objetk<br />";
    }

Warning: mysqli_stmt::bind_param() [mysqli-stmt.bind-param]: Number of elements in type definition string doesn't match number of bind variables in C:\...\file.php on line 18
 
Der Fehler bezieht sich auf diese Zeile oder?:
PHP:
 $stmt->bind_param('BindParameters',$nachname, $vorname, $email, $homepage, $text, $frei);

Die ist zumindest falsch statt 'BindParameters' als ersten parameter anzugeben müssen da die typen der Variablen mit i für integer und s für string rein. Ich gehe mal davon aus das alle außer frei strings sind. Dann ergibt sich:

PHP:
$stmt->bind_param('sssssi',$nachname, $vorname, $email, $homepage, $text, $frei);
 
Zurück
Oben