PHP PDOStatement::execute() expects parameter 1 to be array, boolean given

Synytrix

Cadet 1st Year
Registriert
Juni 2015
Beiträge
14
Hallo liebe Community.
Habe ein kleines Problem mit einem Code.
Es soll ein einfaches Formular ausgefüllt werden dessen Daten dann in einer Projekt Datenbank landet. Habe mir dafür einen fertigen Code geschnappt und abgeändert (dadurch lernt man einfach am besten).
Im ersten Anlauf funktioniert es auch.
Dann beim speichern eines zweiten Projekts erscheint halt unten genannter Fehler.
Auch wenn ich den vorherigen Datensatz lösche und einen neues erstes Projekt anlegen will erscheint der Fehler.

Warning: PDOStatement::execute() expects parameter 1 to be array, boolean given in C:\wamp\www\TimeCatcher\again\nproject.php on line 54

Habe schon verschiedene Fehler Lösungen gesucht und auch getestet aber ich komme einfach nicht weiter.


PHP:
<?php
//include('includes/dbconnect.php');
?>
<?php 
session_start();
$pdo = new PDO('mysql:host=localhost;dbname=TimeCatcher', 'root', '');
?>
<!DOCTYPE html> 
<html> 
<head>
  <title>Neues Projekt</title>	
</head> 
<body>
 
<?php
$showFormular = true; //Variable ob das Registrierungsformular anezeigt werden soll
 
if(isset($_GET['register'])) {
	$error = false;
	$projectnum = $_POST['projectnum'];
	$plannedLT = $_POST['plannedLT'];
	$prodLine = $_POST['prodLine'];
	$FirmaLoc = $_POST['FirmaLoc'];
	$rundir = $_POST['rundir'];
	$config = $_POST['config'];
	$MaschNr = $_POST['MaschNr'];
	$rotNum = $_POST['rotNum'];
	$status = $_POST['status'];
  
	if(strlen($projectnum) == 0) {
		echo 'Bitte geben Sie eine Projekt Nummer an.<br>';
		$error = true;
	}
		
	//Überprüfe, dass die Projekt Nummer noch nicht registriert wurde
	if(!$error) { 
		$statement = $pdo->prepare("SELECT * FROM projects WHERE projectnum = :projectnum");
		$result = $statement->execute(array('projectnum' => $projectnum));
		$user = $statement->fetch();
		
		if($user !== false) {
			echo 'Diese Projekt Nummer ist bereits vorhanden<br>';
			$error = true;
		}	
	}
	
	//Keine Fehler, wir können das Projekt registrieren
	if(!$error) {	
		$statement = $pdo->prepare("INSERT INTO projects (projectnum, plannedLT, prodLine, FirmaLoc, rundir, config, MaschNr, rotNum, status )
									VALUES (:ID, :projectnum, :plannedLT, :prodLine, :FirmaLoc, :rundir, :config, :MaschNr, :rotNum, :status )");
		$result = $statement->execute(array(':projectnum' => $projectnum, ':plannedLT' => $plannedLT, ':prodLine' => $prodLine, 
											':FirmaLoc' => $FirmaLoc, ':rundir' => $rundir, ':config' => $config,
											':MaschNr' => $MaschNr, ':rotNum' => $rotNum, ':status' => $status)
											or die (mysql_error()));
		
		if($result) {		
			echo 'Das Projekt wurde erfolgreich angelegt.< /br>\n <a href="nproject.php">Hier</a> ein neues Projekt anlegen.';
			$showFormular = false;
		} else {
			echo 'Beim Abspeichern ist leider ein Fehler aufgetreten<br>';
			echo ''.mysql_error();
		}
	} 
}
 
if($showFormular) {
?>

<form action="?register=1" method="post">
Projekt Nummer:<br>
<input type="text" size="40" maxlength="250" name="projectnum"><br>

Geplanter LT:<br>
<input type="text" size="40" maxlength="250" name="plannedLT"><br><hr>

Prod Linie:<br>
<input type="text" size="40" maxlength="250" name="prodLine"><br><br>
 
Firma Standort:
<select name="FirmaLoc">
	<option value=""></option>
	<option value="Ort1">Ort1</option>
	<option value="Ort2">Ort2</option>
	<option value="Ort3.">Ort3</option>
	<option value="Ort4">Ort4</option>
	<option value="Ort5">Ort5</option>
	<option value="Ort6">Ort6</option>
	<option value="Ort7">Ort7</option>
</select><br>

Laufrichtung:
<select name="rundir">
	<option value="Rechts">Rechts</option>
	<option value="Links">Links</option>
</select><br>

Konfiguration:
<select name="config">
	<option value="Trinity">Trinity</option>
	<option value="SC2">SC2</option>
</select><br>

Masch Nr.:<br>
<input type="text" name="MaschNr"><br>

Rotor Nr.:<br>
<input type="text" name="rotNum"><br>

Status.:<br>
<select name="status">
	<option value="In Vorbereitung">In Vorbereitung</option>
	<option value="In Arbeit">In Arbeit</option>
	<option value="Abgeschlossen">Abgeschlossen</option>
</select><br><br>

Bitte &uuml;berpr&uuml;fen Sie alle angaben vor dem Abschicken genau!<br>
Es existiert noch keine Funktion zum l&ouml;schen!<br>

<input type="submit" value="Abschicken">
</form>
 
<?php
} //Ende von if($showFormular)
?>
 
</body>
</html>


Vielen Dank im Voraus.

Mit freundlichen Grüßen,
David
 
Sicher auch, dass

Code:
$result = $statement->execute(array('projectnum' => $projectnum));
$user = $statement->fetch();

funktioniert? Fehlt da nicht ein Doppelpunkt in 'projectnum'?
Und wieso heißt die Variable User obwohl da Projekte reingefetcht werden? Sowas ist der Anfang von gruseligem Code, der Dir beim Debuggen irgendwann Kopfzerbrechen bereiten wird... :)

Bzw. debuggen solltest Du Dir aneignen, dann kannst Du Dir solche Fragen relativ einfach beantworten...
 
Klammern sind alle vorhanden. Ich habs nochmal nach geprüft. Alle vorhanden. Es muss an etwas anderem liegen.

Ich glaube allerdings auch wenn eine Klammer fehlen würde, bekäme ich einen Fehler wie "expected ')' in line 53" oder sowas ähnliches..


/Edit:
Das $user ist noch Rest vom vorherigem Code. Habe ja einen fertigen Code abgeändert.

Habe mal ein Doppelpunkt hinzugefügt. Ergebnis ist das gleiche. Immernoch der PDOStatement::execute Fehler.
 
Zuletzt bearbeitet:
Für welche Version wurde der Code geschrieben und welche Version von PHP nutzt du?
 
@Hancock
Gut mit der Neuplatzierung der Klammern funktioniert es ein neues Projekt anzulegen. Allerdings wenn ich ein 2. Anlegen will begrüßt mcih ein komplett weißes Browserfenster.
Hier nochmal der aktuelle Code mit allen Ausbesserungen.

PHP:
<?php
$showFormular = true; //Variable ob das Registrierungsformular anezeigt werden soll
 
if(isset($_GET['register'])) {
	$error = false;
	$projectnum = $_POST['projectnum'];
	$plannedLT = $_POST['plannedLT'];
	$prodLine = $_POST['prodLine'];
	$FirmaLoc = $_POST['FirmaLoc'];
	$rundir = $_POST['rundir'];
	$config = $_POST['config'];
	$MaschNr = $_POST['MaschNr'];
	$rotNum = $_POST['rotNum'];
	$status = $_POST['status'];
  
	if(strlen($projectnum) == 0) {
		echo 'Bitte geben Sie eine Projekt Nummer an.<br>';
		$error = true;
	}
		
	//Überprüfe, dass die Projekt Nummer noch nicht registriert wurde
	if(!$error) { 
		$statement = $pdo->prepare("SELECT * FROM projects WHERE projectnum = :projectnum");
		$result = $statement->execute(array('projectnum' => $projectnum));
		$pronum = $statement->fetch();
		
		if($pronum !== false) {
			echo 'Diese Projekt Nummer ist bereits vorhanden<br>';
			$error = true;
		}	
	}
	
	//Keine Fehler, wir können das Projekt registrieren
	if(!$error) {	
		$statement = $pdo->prepare("INSERT INTO projects (projectnum, plannedLT, prodLine, FirmaLoc, rundir, config, MaschNr, rotNum, status )
									VALUES (:projectnum, :plannedLT, :prodLine, :FirmaLoc, :rundir, :config, :MaschNr, :rotNum, :status )");
		$result = $statement->execute(array('projectnum' => $projectnum, 'plannedLT' => $plannedLT, 'prodLine' => $prodLine, 
											'FirmaLoc' => $FirmaLoc, 'rundir' => $rundir, 'config' => $config,
											'MaschNr' => $MaschNr, 'rotNum' => $rotNum, 'status' => $status))
											or die (mysql_error());
		
		if($result) {		
			echo 'Das Projekt wurde erfolgreich angelegt.< /br>\n <a href="nproject.php">Hier</a> ein neues Projekt anlegen.';
			$showFormular = false;
		} else {
			echo 'Beim Abspeichern ist leider ein Fehler aufgetreten<br>';
			echo ''.mysql_error();
		}
	} 
}
 
Was sagt das phperror.log über die weiße Seite?
 
Doe error Log zeigt nur den alten Fehler um 10:49.
Habe zum Test nochmal versucht ein zweites Projekt zu erstellen allerdings wird kein neuerer Eintrag erstellt.
Der letzte bleibt der um 10:49. (Ist übrigens wieder der PDOExecute fehler.)
 
Oben, das if(isset(.... muss eigentlich ein $_POST sein, schliesslich arbeitest du mit einem Post Formular. Ansonsten, steht beim zweiten Versuch überhaupt was drin im POST Array?
 
Habe die Doppelpunkte ergänzt. Imemrnoch weißes Fenster.

@Mojo1987
Verstehe ich das richtig das ich das $_GET['usw...'] durch $_POST['...'] ersetzen soll?
Falls ja.. Dann passiert quasi nichts.. die Felder des Formulars werden beim Klick auf Abschicken geleert und das wars.
 
Es sollte in etwa so aussehen:

PHP:
if( $_POST )
{
........
Hier packst dein Query rein.
}
 
Immernoch ein weißer Bildschirm. Error gibt es keine und der weiße Bildschirm wäre auch nicht so wild wenn die Projekte wenigstens in der Datenbank landen würden.. allerdings passiert auch das nicht.
Es scheint als würde das Abgeschickte Formular auf dem weg einfach zerstört werden oder so
 
Hancock schrieb:
echo's einbauen, dass es kracht, wenn es sein muss, in jeder Zeile. Du hast ja sicherlich bei PHP error_reporting auf Maximal gestellt?

Ja das ist debuggen von Hand, so habe ich auch mal angefangen. :) Besser wäre es aber, sich direkt das debuggen mit einer Entwicklungsumgebung anzueigenen.

Oder auch schon mal das error reporting richtig setzen, Exceptions aktivieren etc. wurde alle schon genannt, ein Skript raucht nicht ab ohne jegliche Info.

Aber ist alles nur rumstochern im dunkeln, ohne das mal richtig auszuführen, wo ich gerade keine Gelegenheit zu habe. Mit einem Debuggar würde man den Fehler wirklich schnell finden.
 
Zuletzt bearbeitet:
Also, ich habs mir jetzt lokal mal aufgesetzt, ich kann auch mehrere Projekte hintereinander anlegen. Klicke nach jedem Projekt auf hier.

< /br> muss übrigens <br /> heißen. Und wenn Du auch das \n richtig berücksichtigt haben willst, muss die Zeile so aussehen:

Code:
echo "Das Projekt wurde erfolgreich angelegt.<br />\n <a href=\"nproject.php\">Hier</a> ein neues Projekt anlegen.";

Meine Tabelle sieht so aus:


Code:
CREATE TABLE `projects` (
  `projectnum` int(11) NOT NULL,
  `plannedLT` varchar(250) NOT NULL,
  `prodLine` varchar(250) NOT NULL,
  `FirmaLoc` varchar(250) NOT NULL,
  `rundir` varchar(250) NOT NULL,
  `config` varchar(250) NOT NULL,
  `MaschNr` int(11) NOT NULL,
  `rotNum` int(11) NOT NULL,
  `status` varchar(250) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin2;
 
Zuletzt bearbeitet:
Zurück
Oben