Strato / PHP: Insert funktioniert nicht?
Hallo,
ich wollte, da ich gern programmiere, auf Strato eine PHP Seite testen und musste feststellen, dass es nicht funktioniert, egal was ich auch versucht habe.
Ich habe mir einmal alle Fehlermeldungen anzeigen lassen und bin auf diese gestoßen:
Warning: Undefined variable $con in ... on line 15 Fatal error: Uncaught TypeError: mysqli_query(): Argument #1 ($mysql) must be of type mysqli, null given in ...:15 Stack trace: #0...(15): mysqli_query() #1 {main} thrown in ...on line 15
Leider kann ich damit nicht viel anfangen. Ich habe auch schon davon gehört, dass man die Variablen in Superglobals umwandeln muss. Leider weiß ich auch damit nichts anzufangen. Weiß jemand eine Antwort?
Hier noch mein PHP-Code:
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('mysql.trace_mode', true);
?>
<?php
session_start();
require_once('dbconnection.php');
// Code for Registration
if (isset($_POST['signup'])) {
$fname = $_POST['fname'];
$lname = $_POST['lname'];
$sql = mysqli_query($con,"select id from users where fname='$fname'");
$row = mysqli_num_rows($sql);
if ($row > 0) {
echo "<script>alert('Name schon angemeldet');</script>";
}
else {
$msg = mysql_query("insert into users(fname, lname) values('$fname','$lname')");
if ($msg) {
echo "<script>alert('Erfolgreich Eingetragen');</script>";
}
}
}
LG
4 Antworten
Probier bitte das mal. Wo bei du natürlich die von Strato gegbenen Daten einsetzen musst.
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// Create connection
$conn = new mysqli($servername, $username, $password);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?>
Du benutzt die Variable $con die nirgendwo definiert ist...
php insert funktioniert nicht?
Lösch das $con in dieser Zeile.
Falsch:
$sql=mysqli_query($con,"select id from users where fname='$fname'");
Richtig:
$sql=mysqli_query("select id from users where fname='$fname'");
Alex
Das ist falsch. Die Funktion braucht als erstes Argument ein Verbindungsobjekt. Das kann nur weggelassen werden, wenn man die query-Methode über ein mysqli-Objekt aufruft.
1) Zuerst muss sichergestellt werden, dass es überhaupt eine $con-Variable gibt. Laut der Fehlermeldung ist dem nicht der Fall. Schau in deine dbconnection.php.
2) Diesen SQL Query, wie er derzeit ist, solltest du nicht so lassen. Du fügst $fname in den Query ein, ohne den Wert auch nur ansatzweise zu prüfen. Wer Lust und Laune hat, könnte deinem Skript also auch Schadcode zusenden, der bspw. alle Einträge deiner Datenbank löscht.
Verwende ein Prepared Statement stattdessen.
$stmt = mysqli_prepare($con, "select id from users where fname=?");
mysqli_stmt_bind_param($stmt, "s", $fname);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$numberOfRows = mysqli_stmt_num_rows($stmt);
if ($numberOfRows > 0) {
// ...
}
else {
// ...
}
3) Bei deinem INSERT solltest du ähnlich vorgehen (die Zeile ist eh falsch). Also statt:
$msg=mysql_query("insert into users(fname,lname) values('$fname','$lname')");
besser:
$stmt = mysqli_prepare($con, "insert into users(fname, lname) values(?, ?)");
mysqli_stmt_bind_param($stmt, "ss", $fname, $lname);
if (mysqli_stmt_execute($stmt)) {
// success ...
}
else {
// failed ...
}
Danke ich habe nun diesen code:
<?php session_start:
require_once('dbconnection.php');
$servername = "...";
$username = "...";
$password = "...";
// Create connection
$con = new mysqli($servername, $username, $password);
// Check connection
if ($con->connect_error) {
die("Connection failed: " . $con->connect_error);
}
echo "Connected successfully";
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('mysql.trace_mode', true);
//Code for Registration
if(isset($_POST['signup']))
{
$fname=$_POST['fname'];
$lname=$_POST['lname'];
$stmt = mysqli_prepare($con, "select id from users where fname=?");
mysqli_stmt_bind_param($stmt, "s", $fname);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$numberOfRows = mysqli_stmt_num_rows($stmt);
if ($numberOfRows > 0) {
// ...
}
else {
$stmt = mysqli_prepare($con, "insert into users(fname, lname) values(?, ?)");
mysqli_stmt_bind_param($stmt, "ss", $fname, $lname);
if (mysqli_stmt_execute($stmt)) {
echo "<script>alert('Erfolgreich Eingetragen');</script>";
}
else {
echo"<script>alert('Failed');</script>";
}
}
Nun kriege ich einen HTTP ERROR 500.
Bei einem 500er-Fehler kannst du stets davon ausgehen, dass du Syntaxfehler eingebaut hast. Er wird auch gleich in der ersten Zeile sichtbar:
session_start:
Richtig wäre
session_start();
2) Da du die Verbindung nun direkt im Skript aufbaust, sollte
require_once('dbconnection.php');
raus.
3) Du beginnst prozeduralen und objektorientierten Stil zu vermischen:
$con = new mysqli($servername, $username, $password);
// ...
if ($con->connect_error) {
// ...
$stmt = mysqli_prepare($con, "select id from users where fname=?");
Davon würde ich abraten. Ein uneinheitlicher Stil macht deinen Code nur schwerer lesbar. Schau in die Dokumentation für die einzelnen Funktionen. Dort siehst du beide Stile aufgeführt. Für
new mysqli(...)
Danke. Jedoch funktioniert der code auch so nicht.