Din huvudfil:
<html>
<h1>Comment</h1>
</html>
Klartext
<?php
$servernamn = "10.209.1.164";
$anv= "116941_jd93933";
$pass= "*******";
Anger kredentialer för databasen. Lägg gärna till databas här på en gång:
<?php
$servernamn = "10.209.1.164";
$anv= "116941_jd93933";
$pass= "*******";
$databas = "comments";
$conn =new mysqli($servernamn,$anv,$pass);
if ($conn -> connect_error) {
die("Ej ansluten: " . $conn-> connect_error);
}
echo "Ansluten till databasen";
mysqli_select_db($conn,"comments");
Anslut till databasserver.
Kontrollera om det blev fel.
Anslut till databas.
Försök istället att ansluta till databasen på databasservern direkt och lägg felkontrollen direkt på kommandot:
if($conn = mysqli_connect($servernamn, $anv, $pass, $databas))
{
echo "Ansluten till databasen";
}
else
{
die("Ej ansluten: " . $conn-> connect_error);
}
$find_comments = mysqli_query($conn,"SELECT * FROM comments");
Förklaring till SQL:
Hämta alla attribut från tabellen "comments"
Ändra till objektorienterat stuk och lägg på felkontroll:
$sql = "SELECT * FROM comments";
if(!$find_comments = $conn-> query($sql))
{
die("Fel, kontrollera SQL: ".$sql);
}
while($row = mysql_fetch_assoc($conn,$find_comments))
{
$comment_name = $row['name'];
$comment = $row['comment'];
echo "$comment_name - $comment<p>";
}
Här loopar du igenom resultatet. Blir det fel här är det vanligen fel på SQL-frågan. Har du en tabell "comment" i databasen "comment"?
Ändra till objekt:
while($row = $conn->fetch_assoc($find_comments))
{
$comment_name = $row['name'];
$comment = $row['comment'];
echo "$comment_name - $comment<p>";
}
if(isset($_GET['error']))
{
echo "";
}
?>
Kontrollera om det finns en variabel "error" satt i URLen. Har inget med SQLen att göra.
<html>
<form action="post_comment.php" method="POST">
<input type="text" name="name" value="Your Name"><br>
<textarea name="comment" cols="50" rows="2">Enter a comment</textarea>
<input type="submit" value="Comment">
</form>
</html>
Klartext
Din andra fil:
<?php
$servernamn = "10.209.1.164";
$anv= "116941_jd93933";
$pass= "*******";
$db= "116941-php";
Uppgifter för att ansluta till databas. Ser bra ut.
mysql_connect($servernamn,$anv,$pass,$db);
mysql_select_db("comments");
Här har du gjort en mysql_connect. Aj, aj. Använd inte mysql_connect, använd mysqli_connect!
mysql_select_db verkar göra en för dig felaktig åtgärd. Enligt kredentialerna heter inte databasen "connect", den heter "116941-php".
Skriv om detta, använd mysqli_connect och kontrollera samtidigt om det blir något fel:
if(!$conn = mysqli_connect($servernamn, $anv, $pass, $db)){
die("Kunde inte ansluta till databasen");
}
$name = $_POST["name"];
$comment = $_POST["comment"];
$comment_length =strlen($comment);
Lagra över till variabler.
Mät längden på $comment. OBS: Du bör använda mb_strlen($comment, "UTF-8") istället för att räkna internationella tecken korrekt.
if($comment_lenght > 100)
{
header("location: index.php?error=1");
}
else
{
mysql_query("INSERT INTO comments VALUES('','$name','$comment')");
header("location: index.php");
}
?>
Ganska rättframt, men din else-sats innehåller återigen mysql_. Använd mysqli_!
Dessutom kan du specifiera vilka kolumner du tänkt fylla i i din SQL-sats. Det är bättre både av prestandaskäl men också ifall du ändrar om strukturen i tabellen i ett senare skede.
Tänk också på att din fråga är helt öppen för SQL-hacks. Gör om frågan till en s.k. Prepared Statement.
if($comment_lenght > 100)
{
header("location: index.php?error=1");
}
else
{
$sql = "INSERT INTO comments namn, kommentar VALUES (?,?)";
$stmt = $conn-> prepare($sql);
$stmt-> bind_param("ss", $name, $comment);
$stmt-> execute();
$stmt-> close();
header("location: index.php");
}
?>
Förklaring:
$sql = "INSERT INTO comments namn, kommentar VALUES (?,?)";
Samma SQL-fråga som ovan men har 1) kolumner specifierade 2) Två frågetecken som kommer att översättas till variabler i prepare().
$stmt = $conn-> prepare($sql);
Gör ett frågeobjekt $stmt av frågan. Den kommer nu endast att fungera enligt de regler du specifierat i din fråga. Detta gör det också omöjligt att ändra om/hacka frågan. Det gör den också mottaglig för specialtecken.
$stmt-> bind_param("ss", $name, $comment);
Koppla variablerna $name och $comment till frågeobjektet $stmt. Dessa kommer att matas in som sträng, sträng ("ss")
Notera att du måste koppla variabler, du kan inte skicka in text eller siffror som man kan göra i vanliga funktioner. Dessa variabler kommer dessutom att fortsätta vara kopplade även om du skriver ny data till dem!
$stmt-> execute();
$stmt-> close();
Kör frågan i frågeobjektet. Detta kan man göra flera gånger vid behov.
Stäng frågeobjektet och släpp kopplingen till variablerna.