"We are back" « oc.at

mysql insert ??

Bunny 17.02.2015 - 15:33 4495 21
Posts

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
Hallo,

ich habe wahrscheinlich einen klassischen Fehler den ich nicht finde...

Mein problem..

Ich habe ein Formular, dass die Eingaben per $POST Methode an ein php Skript übergibt, dieses skript baut dann eine Verbindung zur Mysql Datenbank auf.

Soweit sogut, wenn ich im Formular den Button klicke sind die Werte auch im $Post Array .. (ich habe das getestet.. ) .. die Mysql Verbindung wird auch hergestellt.. das Problem liegt anscheinend bei der erstellung des Query zum übermitteln an Mysql...

Das witzige ist aber, sobald ich beim Formular den Button klicke bekomme ich keine Fehlermeldung das irgendetwas schief gegangen ist...
Blick in phpmyadmin zeigt das kein Eintrag vorhanden ist..

Hier das Formular:
Code: HTML
<html>
<head><title>Formular</title></head>

<body>

<form action="formscript.php" method="post">
    <fieldset>
        <legend>Rechnung anlegen</legend>
        <label>RechnungsNr.: <input type="text" name="RechnungsNr" /></label><br />
        <label>Betrag: <input type="text" name="Betrag" /></label><br />
	<label>Nachname: <input type="text" name="Nachname" /></label><br />
   </fieldset>
  <fieldset>
	<legend>Optional</legend>
	<label>Vorname: <input type="text" name="Vorname" /></label><br />
	<label>Adresse: <input type="text" name="Adresse" /></label><br />
	<label>Notiz: <input type="text" name="Notiz" /></label><br />
	<label>Datum: <input type="text" name="Datum" /></label><br />
        <input type="submit" value="Erstellen" />
    </fieldset>
</form>

</body>

</html>

Hier das PHP skript:
Code: PHP
<?php
error_reporting(E_ALL);
ini_set('display_errors',1);

$db = new mysqli('localhost', 'root', password', 'database');
if (mysqli_connect_errno()) {
    die('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
}

	if('POST' == $_SERVER['REQUEST_METHOD']){
		 if (!isset($_POST['RechnungsNr'], $_POST['Betrag'], $_POST['Nachname'])) {
        	die ('Benutzen sie nur Formulare von der Homepage.');
    	}

    	if (('' == $rechnungsnr = trim($_POST['RechnungsNr'])) or 
        	    ('' == $betrag = trim($_POST['Betrag'])) or
            	('' == $nachname = trim($_POST['Nachname']))) {
       		 die ('Bitte Pflichtfelder ausfuellen.');
   	 }

	$vorname == $_POST['Vorname'];
	$adresse == $_POST['Adresse'];
	$notiz == $_POST['Notiz'];
	$datum == $_POST['Datum'];

	$sql = 'INSERT INTO
			calculation(RechnungsNr, Betrag, Vorname, Nachname, Adresse, Notiz, Datum)
		VALUES
			//   (?,?,?,?,?,?,NOW())';
			($_POST['RechnungsNr'],$_POST['Betrag'],$_POST['Vorname'],$_POST['Nachname'],$_POST['Adresse'],$_POST['Notiz'],NOW())';
	$stmt = $db->prepare($sql);

	if(!$stmt){
		die ('Es konnte kein SQL-Query vorbereitet werden: '.db->error);
	}
	
	$stmt->bind_param('idssss', $rechnungsnr, $betrag, $vorname, $nachname, $adresse, $notiz, $datum);
	if(!$stmt->execute()){
		die ('Query konnte nicht ausgefuehrt werden: '.$stmt->error);
	}

}
?>
Jemand eine idee??

danke.
Bearbeitet von Bunny am 17.02.2015, 15:38

Longbow

Here to stay
Avatar
Registered: Feb 2003
Location: Homeoffice
Posts: 5502
braucht das ding evtl. vorher "use mydatabase" ?

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
wie meinst du das ?

AdRy

Auferstanden
Avatar
Registered: Oct 2002
Location: Wien
Posts: 5239
Weil du einfache Anführungssrtriche inerhalb von einfachen hast bei $sql würd ich mal sagen. Du musst die Äußren auf doppelte: " ändern. Also:
Code: PHP
$sql = "INSERT INTO
			calculation(RechnungsNr, Betrag, Vorname, Nachname, Adresse, Notiz, Datum)
		VALUES	($_POST['RechnungsNr'],$_POST['Betrag'],$_POST['Vorname'],$_POST['Nachname'],$_POST['Adresse'],$_POST['Notiz'],NOW())";

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
Ich bin zwar schon ein weilchen weg von PHP, trotzdem ein paar Fragen:

Wozu hast du die Vergleiche
$vorname == $_POST['Vorname'];
$adresse == $_POST['Adresse'];
$notiz == $_POST['Notiz'];
$datum == $_POST['Datum'];

Du solltest dein statement escapen bzw. am besten doublequotes benuetzen und die Variablen einfach in den String schreiben ala
"Der aktuelle UNIX-Timestamp ist $zeit.";

Jetzt seh ich erst, dass du unten noch versuchst, parameter an das Statement zu binden - schau dir mal ein entsprechendes Tutorial zu prepared statements an - du hast da einen Misch-Masch beinander ;)

http://www.w3schools.com/pHp/php_my..._statements.asp
Bearbeitet von Obermotz am 17.02.2015, 15:44

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
okay, danke für die tipps.. ich probier gleich mal herum..


EDIT:

Also, ich hab das skript jetzt noch etwas vereinfacht/verkürzt.

so siehts derzeit aus.

Code: PHP
<?php
error_reporting(E_ALL);
ini_set('display_errors',1);

$db = new mysqli('localhost', 'root', 'password', 'database');
if (mysqli_connect_errno()) {
    die('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
}

	if('POST' == $_SERVER['REQUEST_METHOD']){
		 if (!isset($_POST['RechnungsNr'], $_POST['Betrag'], $_POST['Nachname'])) {
        	die ('Benutzen sie nur Formulare von der Homepage.');
    	}

    	if (('' == $rechnungsnr = trim($_POST['RechnungsNr'])) or 
        	    ('' == $betrag = trim($_POST['Betrag'])) or
            	('' == $nachname = trim($_POST['Nachname']))) {
       		 die ('Bitte Pflichtfelder ausfuellen.');
   	 }

	
	$sql = "INSERT INTO
			calculation(RechnungsNr, Betrag, Nachname)
		VALUES
			   (?,?,?)";
		
	$stmt = $db->prepare($sql);

	if(!$stmt){
		die ('Es konnte kein SQL-Query vorbereitet werden: '.db->error);
	}
	
	$stmt->bind_param('idssss', $rechnungsnr, $betrag, $vorname, $nachname, $adresse, $notiz, $datum);
	if(!$stmt->execute()){
		die ('Query konnte nicht ausgefuehrt werden: '.$stmt->error);
	}

}
?>


es hat sich keine bemerkbare Veränderung gezeigt...
Bearbeitet von Bunny am 17.02.2015, 15:55

Longbow

Here to stay
Avatar
Registered: Feb 2003
Location: Homeoffice
Posts: 5502
Zitat von Bunny
wie meinst du das ?
mein erster gedanke war, dass du erst die DB angeben musst welche er für die inserts nehmen soll, aber ich hab überlesen, dass du im connect ja schon "database" hast - da fehlt dir aber am ende das ' :D

Nico

former person of interest
Registered: Sep 2006
Location: -
Posts: 4082
stand 15:55

wo is das post-array oder sein inhalt im sql statement?

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
man kann die Array statements durch ? Fragezeichen angeblich ersetzn... ich kanns aber auch wieder ändern...

ich ändere es wieder..


EDIT::

wurde wieder geändert:

Code: PHP
$sql = "INSERT INTO
			calculation(RechnungsNr, Betrag, Nachname)
		VALUES	
			($_POST['RechnungsNr'],$_POST['Betrag'],$_POST['Nachname'])";
Bearbeitet von Bunny am 17.02.2015, 16:08

-=Willi=-

The Emperor protects
Avatar
Registered: Aug 2003
Location: ~
Posts: 1624
Kleiner PHP-Tipp am Rande...vergiss, dass '==' existiert und benutz einfach immer '==='. Da spart man sich viel ärger. Außerdem steht dein Skript so offen für SQL-Injections wie man sie schon in der Volksschule lernt :p. Sieh dir lieber nochmal an wie du dein Statement preparen kannst.

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
jaja.. SQL-Injection... is mir schon klar... es handelt sich hier nicht um ein produktivsystem...

es geht jetzt mal darum herauszufinden warum das eintragen in die Datenbank grundsätzlich nicht funktioniert...

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25642
Bei einem String brauchst du in SQL einfache Anführungszeichen. Dein Code gibt dir scheinbar den SQL-Fehler nicht aus, was natürlich dann zum Rätselraten führt.

So wäre es richtig:
Code: PHP
$sql = "INSERT INTO calculation(RechnungsNr, Betrag, Nachname)
	VALUES ('".$db->real_escape_string($_POST['RechnungsNr'])."','".$db->real_escape_string($_POST['Betrag'])."','".$db->real_escape_string($_POST['Nachname'])."')";

Abgesehen davon würde ich gleich einen Wrapper für die DB-Engine schreiben und Substitution für die Parameter verwenden, so wie es mit sprintf() zB möglich ist. Diese Parameter kannst du dann auch automatisiert per mysqli_real_escape_string() korrekt aufbereiten.

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
danke für den Hinweis, ich habs soeben geändert.. keine Veränderung sichtbar

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25642
Check das php bzw. apache error log.

berndy2001


Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2058
Zitat von Bunny
bekomme ich keine Fehlermeldung das irgendetwas schief gegangen ist...
Blick in phpmyadmin zeigt das kein Eintrag vorhanden ist..
php fehlermeldungen abgedreht? gibt ja log_errors und display_errors
Bearbeitet von berndy2001 am 17.02.2015, 16:39
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz