PHP kod vill inte fungera/amatör

Permalänk

PHP kod vill inte fungera/amatör

Håller på att skapa ett kommentarsfält i php som ska kopplas till mysql men det vill inte fungera.
Här är min index.php kod, får upp detta varningsmeddelandet när jag kör det i chrome: Warning: mysql_fetch_assoc() expects parameter 1 to be resource, object given in /storage/content/41/116941/php.kitas.se/public_html/index.php on line 21
Någon som vet vad det är för fel? (den feta texten i koden)

<html> <h1>Comment</h1> </html> <?php $servernamn = "10.209.1.164"; $anv= "116941_jd93933"; $pass= "*******"; $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"); $find_comments = mysqli_query($conn,"SELECT * FROM comments"); while($row = mysql_fetch_assoc($conn,$find_comments)) { $comment_name = $row['name']; $comment = $row['comment']; echo "$comment_name - $comment<p>"; } if(isset($_GET['error'])) { echo ""; } ?> <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>

Permalänk
Medlem

Kollade på http://php.net/manual/en/function.mysql-fetch-assoc.php

Det ser ut som att du inte behöver skicka med $conn utan att det ska gå bra med $find_comments

jag hade provat med:

while($row = mysql_fetch_assoc($find_comments))

Enligt dokumentationen på http://php.net/manual/en/mysqli.query.php
Ska raden:

$find_comments = mysqli_query($conn,"SELECT * FROM comments"); se ut såhär $find_comments = mysqli_query("SELECT * FROM comments");

Edit: Fel av mig "mysqli_query" går att använda på båda visen.

Permalänk

@tanion82: Har testat med både $conn och utan och det blir samma fel ändå, förstår inte...

Permalänk
Medlem

mysql_fetch_assoc vill ha ett resultat från mysql_query (eller motsvarande)
"array mysql_fetch_assoc ( resource $result )"

provade du att ta bort $conn ur while-uttrycket?

gör en "var_dump($find_comments);" innan while-loopen för att se vad du fick för resultat av databasslagningen så det inte är där det spökar.

$find_comments = mysqli_query($conn,"SELECT * FROM comments"); var_dump($find_comments); // för att se vad du får för resultat av mysql_query while($row = mysql_fetch_assoc($find_comments)) // $conn borttaget för att det ska stämma med de variabler funktionen vill ha { $comment_name = $row['name']; $comment = $row['comment']; echo "<p>$comment_name - $comment</p>"; //ändrat <p> så du inte lämnar öppna taggar. }

Permalänk
Medlem

Använd inte mysql_*, använd PDO.

Databasanslutning

$connection = new PDO('mysql:host='localhost';dbname='databasnamn';charset=utf8', username, password); $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

För att hämta något från databasen:

$get = $connection->prepare("SELECT * FROM `comments`"); $get->execute(); $results = $get->fetchAll(PDO::FETCH_ASSOC);

Sedan bara loopa igenom

foreach ($results as $result) { echo $result["name"] // ... }

När du vill stoppa in variabler för att t.ex. hitta något specifikt gör du bara

$get = $connection->prepare("SELECT * FROM `comments` WHERE name = :name" AND bla = :bla); $get->execute([":name" => $dinVariabel, ":bla" => $bla]);

Visa signatur

AW3423DW QD-OLED - Ryzen 5800x - MSI Gaming Trio X 3090 - 64GB 3600@cl16 - Samsung 980 Pro 2TB/WD Black SN850 2TB

Permalänk
Medlem

Problemet här är att man blandar det objektorienterade gränssnittet från mysqli (new mysqli(...)) med det procedurella från både mysqli_ och mysql_.

Den objektorienterade varianten är

$conn = new mysqli($servernamn,$anv,$pass); ... if ($conn->connect_error) { ... $conn->select_db("comments"); ... $find_comments = $conn->query("SELECT * FROM comments"); ...

osv

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Du har glömt att ange databasens namn i ditt mysqli-objekt.
Server, användare och lösenord finns där, men namnet på databasen är inte angivet.

Visa signatur

- none -

Permalänk

@tanion82: Fick dessa varningar när jag la till var_dump

object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(3) ["lengths"]=> NULL ["num_rows"]=> int(0) ["type"]=> int(0) } Warning: mysql_fetch_assoc() expects parameter 1 to be resource, object given in /storage/content/41/116941/php.kitas.se/public_html/index.php on line 23

Permalänk

@Teknocide: Är det såhär du menar? fick detta varningsmeddelandet Fatal error: Call to undefined method mysqli::fetch_assoc() in /storage/content/41/116941/php.kitas.se/public_html/index.php on line 22

<?php $servernamn = "10.209.1.164"; $anv= "116941_jd93933"; $pass= "phpkitas"; $db= "116941-php"; $conn =new mysqli($servernamn,$anv,$pass,$db); if ($conn -> connect_error) { die("Du kan inte konnekta till databasen: " . $conn-> connect_error); } echo "Vi har lyckats ansluta oss till databasen"; $conn->select_db("comments"); $find_comments = $conn->query("SELECT * FROM comments"); while($row = $conn->fetch_assoc($find_comments)) { $comment_name = $row['name']; $comment = $row['comment']; echo "<p>$comment_name - $comment</p>"; } if(isset($_GET['error'])) { echo ""; } ?>

Permalänk
Medlem

En grej som du gjorde var också att blanda mysql_ och mysqli_

$find_comments = mysqli_query($conn,"SELECT * FROM comments"); while($row = mysql_fetch_assoc($conn,$find_comments))

Permalänk
Medlem

Det ska vara

while($row = $find_comments->fetch_assoc()) {
echo "<p>".$row['comment']." - ".$row['name']."</p>;
}

Se: http://php.net/manual/en/mysqli-result.fetch-assoc.php#exampl...

Rekommenderar starkt att använda Objektorienterade varianten, då det blir så mycket trevligare att läsa koden.

Permalänk
Medlem
Skrivet av helpme123:

@Teknocide: Är det såhär du menar? fick detta varningsmeddelandet Fatal error: Call to undefined method mysqli::fetch_assoc() in /storage/content/41/116941/php.kitas.se/public_html/index.php on line 22

<?php $servernamn = "10.209.1.164"; $anv= "116941_jd93933"; $pass= "phpkitas"; $db= "116941-php"; $conn =new mysqli($servernamn,$anv,$pass,$db); if ($conn -> connect_error) { die("Du kan inte konnekta till databasen: " . $conn-> connect_error); } echo "Vi har lyckats ansluta oss till databasen"; $conn->select_db("comments"); $find_comments = $conn->query("SELECT * FROM comments"); while($row = $conn->fetch_assoc($find_comments)) { $comment_name = $row['name']; $comment = $row['comment']; echo "<p>$comment_name - $comment</p>"; } if(isset($_GET['error'])) { echo ""; } ?>

Du ska kalla fetch_assoc på resultatet av din query, alltså $find_comments.

while ($row = $find_comments->fetch_assoc()) { // gör saker }

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk

@LemonIllusion: Tack nu finns inga varningar, ett annat problem är att den inte verkar vilja fungera med databasen i phpmyadmin. Använder mig av två filer, index.php och post_comment.php. Kommentarerna sparas inte ens inne på databasen.
Vet du vad det kan bero på?

Post_comment.php

<?php $servernamn = "10.209.1.164"; $anv= "116941_jd93933"; $pass= "*******"; $db= "116941-php"; mysql_connect($servernamn,$anv,$pass,$db); mysql_select_db("comments"); $name = $_POST["name"]; $comment = $_POST["comment"]; $comment_length =strlen($comment); if($comment_lenght > 100) { header("location: index.php?error=1"); } else { mysql_query("INSERT INTO comments VALUES('','$name','$comment')"); header("location: index.php"); } ?>

index.php

<html> <h1>Comment</h1> </html> <?php $servernamn = "10.209.1.164"; $anv= "116941_jd93933"; $pass= "******"; $db= "116941-php"; $conn =new mysqli($servernamn,$anv,$pass,$db); if ($conn -> connect_error) { die("Du kan inte konnekta till databasen: " . $conn-> connect_error); } echo "Vi har lyckats ansluta oss till databasen"; $conn->select_db("comments"); $find_comments = $conn->query("SELECT * FROM comments"); while ($row = $find_comments->fetch_assoc()) { $comment_name = $row['name']; $comment = $row['comment']; echo "<p>$comment_name - $comment</p>"; } if(isset($_GET['error'])) { echo ""; } ?> <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>

Permalänk
Medlem
Skrivet av helpme123:

@LemonIllusion: Tack nu finns inga varningar, ett annat problem är att den inte verkar vilja fungera med databasen i phpmyadmin. Använder mig av två filer, index.php och post_comment.php. Kommentarerna sparas inte ens inne på databasen.
Vet du vad det kan bero på?

Post_comment.php

<?php $servernamn = "10.209.1.164"; $anv= "116941_jd93933"; $pass= "*******"; $db= "116941-php"; mysql_connect($servernamn,$anv,$pass,$db); mysql_select_db("comments"); $name = $_POST["name"]; $comment = $_POST["comment"]; $comment_length =strlen($comment); if($comment_lenght > 100) { header("location: index.php?error=1"); } else { mysql_query("INSERT INTO comments VALUES('','$name','$comment')"); header("location: index.php"); } ?>

index.php

</html> <?php $servernamn = "10.209.1.164"; $anv= "116941_jd93933"; $pass= "******"; $db= "116941-php"; $conn =new mysqli($servernamn,$anv,$pass,$db); if ($conn -> connect_error) { die("Du kan inte konnekta till databasen: " . $conn-> connect_error); } echo "Vi har lyckats ansluta oss till databasen"; $conn->select_db("comments"); $find_comments = $conn->query("SELECT * FROM comments"); while ($row = $find_comments->fetch_assoc()) { $comment_name = $row['name']; $comment = $row['comment']; echo "<p>$comment_name - $comment</p>"; } if(isset($_GET['error'])) { echo ""; } ?> <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>

Du blandar mysql och mysqli friskt, men verkar inte ha koll på hur någon av dem fungerar. Jag föreslår att du lär dig använda mysqli ordentligt.

Det här ser ut att vara en rätt vettig tutorial: http://codular.com/php-mysqli

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem

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.

Sammanslagning av poster
Visa signatur

Kör Linux - Yes! We are the 2 percent! And growing... Föreslå inte ens något Windows-exklusivt om jag inte specifikt frågar efter något till Win.
2600K - 18GB RAM - 1TB HDD - 64GB SSD - GTX 650 Ti Boost
Minnesvärda trådar: 1, 2

Permalänk

@Erwya: Ja, har en tabell som heter comments, har Kolumnerna:
ID(int 11,auto_increment, primary key,)
name(varchar 100, latin_swedish_ci)
comment(varchar 100, latin_swedish_ci)

Tack för hjälpen, ska fixa till koden och återkommer hur det går.

Permalänk

@Erwya: Har nu fixat till koden men får upp denna varningen i post_comment.php. Vad är det för fel?

Fatal error: Call to a member function bind_param() on boolean in
/storage/content/41/116941/php.kitas.se/public_html/post_comment.php on line 27

<?php $servernamn = "10.209.1.164"; $anv= "116941_jd93933"; $pass= "phpkitas"; $db= "116941-php"; if(!$conn = mysqli_connect($servernamn, $anv, $pass, $db)){ die("Kunde inte ansluta till databasen"); } mysqli_select_db($conn,"116941-php"); $name = $_POST["name"]; $comment = $_POST["comment"]; $comment_length =mb_strlen($comment, "UTF-8"); 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"); } ?>

Permalänk
Medlem

Den klagar på att du kallar bind_param() på en boolean, alltså något som är true/false. Jag tippar på att $stmt har fått värdet false, antagligen returnerar $conn->prepare() false i stället för ett statement-objekt om prepare misslyckas. Om så är fallet tror jag att felet är din SQL-syntax, har för mig att det skall vara parenteser runt namn och kommentar:

INSERT INTO comments (namn, kommentar) VALUES (?,?)

Permalänk

@Tazavoo: YEES det var det, tack som fan!

Permalänk
Medlem
Skrivet av helpme123:

@Erwya: Ja, har en tabell som heter comments, har Kolumnerna:
ID(int 11,auto_increment, primary key,)
name(varchar 100, latin_swedish_ci)
comment(varchar 100, latin_swedish_ci)

Tack för hjälpen, ska fixa till koden och återkommer hur det går.

Skrivet av helpme123:

@Erwya: Har nu fixat till koden men får upp denna varningen i post_comment.php. Vad är det för fel?

Fatal error: Call to a member function bind_param() on boolean in
/storage/content/41/116941/php.kitas.se/public_html/post_comment.php on line 27

<?php $servernamn = "10.209.1.164"; $anv= "116941_jd93933"; $pass= "phpkitas"; $db= "116941-php"; if(!$conn = mysqli_connect($servernamn, $anv, $pass, $db)){ die("Kunde inte ansluta till databasen"); } mysqli_select_db($conn,"116941-php"); $name = $_POST["name"]; $comment = $_POST["comment"]; $comment_length =mb_strlen($comment, "UTF-8"); if($comment_lenght > 100) { header("location: index.php?error=1"); } else { $sql = "INSERT INTO comments (name, comments) VALUES (?,?)"; $stmt = $conn-> prepare($sql); $stmt-> bind_param("ss", $name, $comment); $stmt-> execute(); $stmt-> close(); header("location: index.php"); } ?>

Felet ligger i själva frågan. Du har inte bytt ut attributen (kolumnnamnen) mot de som du har i din tabell, i det här fallet name och comments. Sedan missade jag att sätta ut parentes runt attributnamnen. Ursäkta mig...

Ett felsökningstips är att köra frågan i phpmyadmin (byt ut frågetecknen mot värden, i detta fall ex. ("Eva", "Test") ). Om du har en komplicerad fråga med många variabler kan du köra echo $sql; och ta den när den skrivs ut i webbläsaren istället. I det här fallet skulle den troligen sagt "Unknown column name "namn" in comments", vilket ger en hint om man stavat fel eller valt ett attribut som inte existerar i tabellen.

Visa signatur

Kör Linux - Yes! We are the 2 percent! And growing... Föreslå inte ens något Windows-exklusivt om jag inte specifikt frågar efter något till Win.
2600K - 18GB RAM - 1TB HDD - 64GB SSD - GTX 650 Ti Boost
Minnesvärda trådar: 1, 2