Einen wunderschönen Guten Abend.
Hab ein bisschen zuviel Zeit, da hab ich mal rumgesucht und ma noch keine Tutorials oder ähnlichs zu MySQLi gefunden.
Möchte ich mal ein kleines Tutorial machen, wie man mit MySQLi eine einfach Verbindung zur Datenbank aufbaut.
Ich arbeite mit PHP5 und MySQL 4.1.7.
MySQLi ist erst aber einer Version von 4.1 aufwärst verfügbar.
Ich gehe von einem installierten Xampp aus, mit Host = localhost, user = root, passwort = keins und Db = php.
Vorne weg, was passieren kann, wenn MySQLi nicht aktiviert ist kommt sowas wie "Fatal Error. Class MySQLi not found in...". Dann mal in die php.ini schauen bei den extensions noch die mysqli.dll eintragen: extension=php_mysqli.dll. Dann einmal den Apache neustarten und das Problem sollte erledigt sein.
Wer Xampp benutzt sollte vorher mal in der phpinfo(); nachsehen wo die php.ini liegt, bei meiner xampp version gibts die php.ini 2mal, dann noch die php5.ini und die php4.ini, man kann da zwischen vers. 4 und 5 umschalten.
Dann habe ich eine DB angelegt die php heißt und eine Tabelle mit 4 Feldern:
CREATE TABLE `trainings` (
`id` int(11) NOT NULL auto_increment,
`titel` varchar(100) NOT NULL default '',
`trainer` varchar(100) NOT NULL default '',
`dauer` int(11) NOT NULL default '0',
PRIMARY KEY (`id`)
) ;
Eine Tabelle für Trainingstitel + Trainer + der Dauer.
Dazu gibt es dann auch ein Formular mit 3 Eingabfeldern, Titel, trainer und die Dauer. Die ID wird automatisch hoch gezählt:
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="POST">
Thema des Trainings: <input type="text" name="titel" />
Name des Trainers: <input type="text" name="trainer" />
Dauer des Trainings: <input type="text" size="2" name="dauer" />
<input type="submit" name="submit" value="Eintragen!" />
</form>
Alles anzeigen
So, nun an die PHP Sachen :).
Zuerst das Eintragen. Dazu eine PHP Datei erstellen. Name ist egal, kann man logischerweise z. B. eintragen.php nennen. In die Datei zuerst das Formular legen, führ hier direkt in einer Datei das eintragen aus:
dann sieht die ungefähr so aus:
<?php
//hier kommt unsere verbindung hin
?>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="POST">
Thema des Trainings: <input type="text" name="titel" />
Name des Trainers: <input type="text" name="trainer" />
Dauer des Trainings: <input type="text" size="2" name="dauer" />
<input type="submit" name="submit" value="Eintragen!" />
</form>
Alles anzeigen
So, nun erstmal eine überprüfung, nach Klick auf Eintragen!, ob auch alle Variablen richtig gesetzt sind und Werte enthalten:
<?php
if (isset($_POST['submit']) && isset($_POST['titel']) && isset($_POST['trainer']) &&
isset($_POST['dauer']) && $_POST['titel'] != '' && $_POST['trainer'] != '' &&
(int)$_POST['dauer'] > 0) {
// MySQLi code gleich
}
?>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="POST">
Thema des Trainings: <input type="text" name="titel" />
Name des Trainers: <input type="text" name="trainer" />
Dauer des Trainings: <input type="text" size="2" name="dauer" />
<input type="submit" name="submit" value="Eintragen!" />
</form>
Alles anzeigen
Bisher kann das Script noch nichts außer überprüfen des Formulars.
Nun erstellen wir die Verbindung zur DB:
if (isset($_POST['submit']) && isset($_POST['titel']) && isset($_POST['trainer']) &&
isset($_POST['dauer']) && $_POST['titel'] != '' && $_POST['trainer'] != '' &&
(int)$_POST['dauer'] > 0) {
try {
$db = new MySQLi('localhost', 'root', '', 'php');
// Neues MySQLi Objekt erstellen und verbindung aufbauen
$sql = 'INSERT INTO trainings (titel, trainer, dauer) VALUES ( ?, ?, ?)';
// SQL Statetment mit 3 Platzhaltern
$kommando = $db->prepare($sql);
$kommando->bind_param('ssi', $_POST['titel'], $_POST['trainer'], $dauer);
// parameter binden, ssi gibt die Datentypen der folgenden Wert an, String/String/Integer
$dauer = (int)$_POST['dauer'];
// dauer noch in Integer umwandeln
$kommando->execute();
// kommando (sql) ausführen, daten werden in die DB geschrieben
// Ausgabe wieviel Zeilen betroffen sind:
//echo $kommando->affected_rows . ' Zeilen betroffen.
';
$db->close();
// Db-Verbindung wird geschlossen
} catch (Exception $e) {
echo 'Fehler: ' . htmlspecialchars($e->getMessage());
}
}
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="POST">
Thema des Trainings: <input type="text" name="titel" />
Name des Trainers: <input type="text" name="trainer" />
Dauer des Trainings: <input type="text" size="2" name="dauer" />
<input type="submit" name="submit" value="Eintragen!" />
</form>
Alles anzeigen
Sooo, nun nach ausführen des Skripts mal einen Blick in PHPMyAdmin werfen und nachsehen ob Daten in der Tabelle stehen.
Normalerweise sollte das funktionieren.
So schwer war das doch garnicht :).
Es gibt noch eine zweite (einfacherer) Möglichkeit die Daten einzutragen, d.h. ohne Prepare:
Nach Verbindung erstellung:
$sql = sprintf('INSERT INTO trainings (titel, trainer, dauer) VALUES (\'%s\', \'%s\', %s)',
$db->real_escape_string($_POST['titel']),
$db->real_escape_string($_POST['trainer']),
(int)$_POST['dauer']
);
$db->query($sql);
$db->close();
Wobei ich die Prepare Variante persönlich besser finde, zwar etwas mehr schreibaufwand, aber man gewöhnt sich dran.
So nun sind die Daten in der DB, wollen wir diese auch wieder rausholen.
Ausgabe mache ich jetzt in eine ganz normale Tabelle.
Leg nun eine neue Datei an, die du z. B. ausgabe.php nennst, und da kommt nun dieser Code rein:
<table>
<tr><th>#</th><th>Thema</th><th>Trainer</th><th>Dauer</th></tr>
<?php
try {
$db = new MySQLi('localhost','root','','php');
// DB wieder auswählen
$sql = 'SELECT * FROM trainings';
// Tabelle auswählen per SELECT
$kommando = $db->prepare($db);
// die Abfrage auswählen
$kommando->execute();
// Abfrage ausführen
$kommando->bind_results($id, $titel, $trainer, $dauer);
// die Ergebnisse sozusagen binden und 4 Variablen angeben für 4 Felder
//Nun die Ausgabe mit einer While Schleife das sollte ja klar sein
while ($kommando->fetch()) {
printf('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>',
$id, htmlspecialchars($thema), htmlspecialchars($trainer), $dauer
);
}
$db->close();
// Datenbankverbindung wieder schließen
} catch (Exception $e) {
echo 'Fehler: ' . htmlsepcialchars($e->getMessage());
}
?>
</table>
Alles anzeigen
So nun ist die Ausgabe da.
Das kann man wiederrum auch anders gestalten, in etwa so:
$sql = 'SELECT * FROM trainings';
$ergebnis = $db->query($sql);
while ($zeile = $ergebnis->fetch_object()) {
printf('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>',
$zeile->id,
htmlspecialchars($zeile->titel),
htmlspecialchars($zeile->trainer),
$zeile->dauer
);
}
$db->close();
Alles anzeigen
Wobei man sich da streiten kann welche Variante besser oder schlechter ist, kommt beides auf das selber raus :D.
Nun ist es natürlich jedem selbst überlassen, ob man die Verbindung mit MySQLi oder mit MySQL aufbaut.
Ich persönlich finde MySQLi die bessere Variante. Dazu auch die Reference ausm PHP Handbuch. Wie man sieht, jede Menge vordefinierte Funktionen.
Dann wünsch ich mal jedem den das Interessiert viel Spaß mit dem Tutorial, hoffe nicht alles umsonst getippt zu haben ...
Greetz
Mülla