PHP Formulardaten in DB speichern klappt nicht

Schnipp

Lt. Commander
Registriert
Feb. 2004
Beiträge
1.138
Hallo zusammen,

ich habe hier gerade ein kleines Problem mit einer PHP-Funktion. Diese Funktion soll die Formulareingaben in einer MySQL-Datenbank speichern.

Der PHP-Code in der entsprechenden Datei sieht wie folgt aus:

PHP:
require_once 'mysql.php';
$db = new DB();

...

<?php
	if(isset($_POST['ok'])) {
		$input1 = $_POST['eingabe1'];
		$input2 = $_POST['eingabe2'];
		...
	
		if($db->funktionsname($input1, $input2, ...)) {
			echo "Daten gespeichert";
		} else {
			echo "Fehler beim Speichern";
		}
	}
?>

Die entsprechende Datei "mysql.php" mit meiner DB-Verbindung und den PHP-Funktionen sieht wie folgt aus:

PHP:
class DB {
	private static $_db_username 		= "dbuser";
	private static $_db_password 		= "dbpassword";
	private static $_db_host 			= "localhost";
	private static $_db_name			= "dbname";
	private static $_db;

function __construct() {
		try {
		self::$_db = new PDO("mysql:host=" . self::$_db_host . ";dbname=" . self::$_db_name,  self::$_db_username , self::$_db_password);
		} catch(PDOException $e) {
			echo "Datenbankverbindung gescheitert!";
			die();
		}
	}

function funktionsname($input1, $input2, ...) {
	$stmt = self::$_db->prepare("INSERT INTO tabellenname VALUES(:input1, :input2, ...)");
	$stmt->bindParam(":input1", $wert1);
	$stmt->bindParam(":input2", $wert2);
	....
	
	if($stmt->execute()) {
		return true;
	} else {
		return false;
	}
}

Leider liefert mir die Funktion immer ein false zurück und ich weiß nicht warum.

Vielleicht hat jemand eine Idee oder kann mir den entscheidenden Tipp geben?!

Gruß Schnipp
 
Spaltentypen sind varchar(255) und text ohne Längenbegrenzung.
 
Klappt leider auch nicht, wenn ich den Parameter als 3. mit übergebe. Fehler bleibt bestehen.
 
PDO::errorCode und PDO::errorInfo benutzen.

PS: Deine DB-Klasse ist übrigens Mist, denn bei jeder neuen Instanziierung machst du ne neue Verbindung auf und überschreibst jedes Mal die bereits offene Verbindung (welche ggf. nicht geschlossen wird). Sieh dir dazu lieber mal das Singleton Pattern an.

@ Majin Vegeta: "Nicht gequotet" - Die DB kümmert sich da komplett selbst drum und lässt dort keinen Mist an Variablen in den Query. Von daher kann da nichts schief gehen und nicht nicht gequotet werden o.ä.
 
Ok, Fehler gefunden. Ich hatte eine Spalte in der Tabelle, wo ich keine NULL-Werte zugelassen hatte und die im Query nicht berücksichtigt wurde. Von daher passt das jetzt.

@Yuuri: wie wäre die DB-Klasse denn besser? Bin absoluter Neuling auf diesem Gebiet und hangel mich durch ein paar Anleitungen und Tutorials.
 
Schnipp schrieb:
Ok, Fehler gefunden. Ich hatte eine Spalte in der Tabelle, wo ich keine NULL-Werte zugelassen hatte und die im Query nicht berücksichtigt wurde. Von daher passt das jetzt.
NULLs lässt du am besten gleich weg. http://www.bennadel.com/blog/85-why-null-values-should-not-be-used-in-a-database-unless-required.htm
Schnipp schrieb:
wie wäre die DB-Klasse denn besser? Bin absoluter Neuling auf diesem Gebiet und hangel mich durch ein paar Anleitungen und Tutorials.
PHP:
<?php

class DB
{
	/**
	 * @var \PDO[]
	 */
	static protected $Instances;

	/**
	 * @param string   $Identifier
	 * @param string   $ConnectionString
	 * @param string   $Username
	 * @param string   $Password
	 * @param string[] $Options
	 *
	 * @return PDO
	 */
	static public function Instance( $Identifier = "default", $ConnectionString = "", $Username = "", $Password = "", array $Options = [ ] )
	{
		$Identifier = (string)$Identifier;
		if( !isset(self::$Instances[$Identifier]) ) self::$Instances[$Identifier] = new \PDO( $ConnectionString, $Username, $Password, $Options );
		return self::$Instances[$Identifier];
	}

	protected function __construct( $Identifier ) { }
}



$db = new DB(); // hier knallts, da der Konstruktur protected ist, Zugang gibts nur über Instance()

$db = DB::Instance( "default", "mysql:host=localhost;dbname=database", "user", "pass" ); // erste Initialisierung zum Eröffnen der Verbindung
$q  = $db->query( "SELECT * FROM `abc`" );
while( $r = $q->fetch() )
{
	echo $r["foo"]."<br>";
}



// später ...
$q = DB::Instance()->query( "SELECT * FROM `def`" );
while( $r = $q->fetch() )
{
	echo $r["bar"]."<br>";
}



DB::Instance( "blog", "mysql:host=localhost;dbname=blog", "bloguser", "passuser" ); // Öffnen der Verbindung zur Blog-DB

$default = DB::Instance( "default" );
$blog    = DB::Instance( "blog" );

$q_default = $default->query( "SELECT * FROM `abc`" );
$q_blog    = $blog->query( "SELECT * FROM `blog_abc`" );
Wäre schon mal ein besserer Einstieg. So öffnest du nur eine Verbindung und greifst im weiteren Verlauf immer nur auf diese Instanz(en) zu.

Das Optimum wäre natürlich, wenn du dich gleich mit Sachen wie Doctrine o.ä. beschäftigst, sodass du gleich ne ordentliche Abstraktion drin hast und auch Sachen verwenden kannst, die auch in großen Projekten verwendet werden.

Zum Lernen und Anfangen reicht das Obige allerdings vollkommen aus und kannst dich dann später mit DB-Abstraktionen auseinandersetzen.
 
Ok, das mit der DB-Klasse werde mir auf jeden Fall mal anschauen. Aber aktuell versuche ich mich an einer anderen Sache, vielleicht kann mir da ja auch jemand helfen:

Ich habe ein Formular, dessen Wert in der DB gespeichert werden sollen. Bei einem Feld kann der User aktuell aus einer Dropdownliste einen vorhandenen Wert auswählen. Nun soll er aber auch die Möglichkeit haben, dass er über einen Button "NEU" oder "+" einen neuen Eintrag in dieser Liste eingeben kann.

Soll also wie folgt ablaufen:

  • Nach Klick auf den Button "NEU" soll sich ein neues Fenster öffnen, wo ein neuer Eintrag angelegt werden kann. Dieser wird zu den bereits vorhandenen Datensätzen in die DB geschrieben.
  • Die bereits im Forumlar eingetragenen Werte sollen auch beim Aufrufen des neuen Fenster noch erhalten bleiben.
  • Nachdem der User in dem neuen Fenster alle Eingaben gemacht hat und den Eintrag speichert, soll sich das Fenster wieder schließen und im ursprünglichen Formular sollen alle Werte stehen, die er vorher bereits eingetragen hatte plus der neue Werte im entsprechenden Feld, den er gerade neu angelegt hat.

Ich hoffe der Sachverhalt wurde einigermaßen verständlich. Keine Ahnung ob die Umsetzung sehr aufwendig oder ein Klacks ist. Bin für jeden Tipp dankbar.

Gruß Schnipp
 
Umsetzung am einfachsten via Javascript. Dein "neues Fenster" könnte dann auch ein Pseudo-Fenster sein (also ein <div> mit CSS schön formatiert).
In reinem Javas​cript ist das ziemlich mühsam, aber mit dem richtigen Framework sollte das machbar sein.
Wie du das machst, kann dir hier sicher ein JS-Experte sagen (der ich nicht bin :)).​
 
Zurück
Oben