PHP - Databasanslutning till MySQL med mysqli (prepared statement)

Permalänk

PHP - Databasanslutning till MySQL med mysqli (prepared statement)

Hej,

har skapat en fin funktion till min kod där jag enkelt lägger till samt tar bort data från databasen.

Nu ska jag bara kunna editera som är kvar och om jag förstått detta rätt så behöver jag prepared statements till? Så jag undrar om någon kan ge mig tips på vart jag lägger den samt hur så det går snabbare att få detta klart samt så jag kan ta till mig av er.

Samt som jag förstår det rätt blir detta enklast med naturaljoin som kan länka ihop två olika tabeller.
Exempel på koden ser ni nedan:

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!-- specifierar karaktärkodning för html --> <title>New year countdown</title> <!-- Titel för webbsidan --> </head> <style> div { position: relative; left: 500px; width: 320px; padding: 10px; border: 5px solid gray; margin: 0; } body {background-color: powderblue;} </style> <body> <div> <?php // sqltest.php require_once 'login.php'; $conn = new mysqli($hn, $un, $pw, $db); if ($conn->connect_error) die($conn->connect_error); if (isset($_POST['delete']) && isset($_POST['isbn'])) { $isbn = get_post($conn, 'isbn'); $query = "DELETE FROM classics WHERE isbn='$isbn'"; $result = $conn->query($query); if (!$result) echo "DELETE failed: $query<br>" . $conn->error . "<br><br>"; } if (isset($_POST['author']) && isset($_POST['title']) && isset($_POST['category']) && isset($_POST['year']) && isset($_POST['isbn'])) { $author = get_post($conn, 'author'); $title = get_post($conn, 'title'); $category = get_post($conn, 'category'); $year = get_post($conn, 'year'); $isbn = get_post($conn, 'isbn'); $query = "INSERT INTO classics VALUES" . "('$author', '$title', '$category', '$year', '$isbn')"; $result = $conn->query($query); if (!$result) echo "INSERT failed: $query<br>" . $conn->error . "<br><br>"; } // $query = "SELECT * FROM classics"; $result = $conn->query($query); if (!$result) die ("Database access failed: " . $conn->error); $rows = $result->num_rows; for ($j = 0 ; $j < $rows ; ++$j) { $result->data_seek($j); $row = $result->fetch_array(MYSQLI_NUM); echo <<<_END <pre> Author $row[0] Title $row[1] Category $row[2] Year $row[3] ISBN $row[4] </pre> <form action="sqltest.php" method="post"> <input type="hidden" name="delete" value="yes"> <input type="hidden" name="isbn" value="$row[4]"> <input type="submit" value="DELETE"></form> _END; } // echo <<<_END <form action="sqltest.php" method="post"> <pre> <input type="checkbox" name="category" value="Thriller">Thriller <input type="checkbox" name="category" value="Romantic">Romantic <input type="checkbox" name="category" value="Swedish">Swedish <input type="checkbox" name="category" value="Animated">Animated <input type="checkbox" name="category" value="Comedy" checked="checked">Comedy <input type="text" name="title">Title <input type="text" name="author">Author <input type="text" name="director">Director <input type="text" name="year">Year <input type="text" name="isbn">ISBN <input type="submit" value="STORE"> </pre></form> _END; $result->close(); $conn->close(); function get_post($conn, $var) { return $conn->real_escape_string($_POST[$var]); } ?> </div> </body> </html>

Rubrik ändrad och tråd sammanfogad.
Permalänk

Hej! Har lagt till prepared statements men det blir lite fel, behöver er hjälp att lösa detta, här är koden:

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!-- specifierar karaktärkodning för html --> <title>New year countdown</title> <!-- Titel för webbsidan --> </head> <style> div { position: relative; left: 500px; width: 320px; padding: 10px; border: 5px solid gray; margin: 0; } body {background-color: powderblue;} </style> <body> <div> <?php // sqltest.php require_once 'login.php'; $conn = new mysqli($hn, $un, $pw, $db); if ($conn->connect_error) die($conn->connect_error); if (isset($_POST['delete']) && isset($_POST['isbn'])) { $isbn = get_post($conn, 'isbn'); $query = "DELETE FROM classics WHERE isbn='$isbn'"; $result = $conn->query($query); if (!$result) echo "DELETE failed: $query<br>" . $conn->error . "<br><br>"; } //// if(isset($_POST['title'])) { // Om INTE användarnamnet är initierad då skriv ut nedanstående inom 'print' parametern. Inloggningsform $query = "SELECT * FROM classics"; $result = $conn->query($query); if (!$result) die ("Database access failed: " . $conn->error); $rows = $result->num_rows; for ($j = 0 ; $j < $rows ; ++$j) { $result->data_seek($j); $row = $result->fetch_array(MYSQLI_NUM); echo <<<_END <pre> Author $row[0] Title $row[1] Category $row[2] Year $row[3] ISBN $row[4] </pre> <form action="sqltest.php" method="post"> <input type="hidden" name="delete" value="yes"> <input type="hidden" name="isbn" value="$row[4]"> <input type="submit" value="DELETE"> <input type="submit" value="EDIT"></form> _END; } echo <<<_END <form action="sqltest.php" method="post"> <pre> <input type="checkbox" name="category" value="Thriller">Thriller <input type="checkbox" name="category" value="Romantic">Romantic <input type="checkbox" name="category" value="Swedish">Swedish <input type="checkbox" name="category" value="Animated">Animated <input type="checkbox" name="category" value="Comedy" checked="checked">Comedy <input type="text" name="title">Title <input type="text" name="author">Author <input type="text" name="director">Director <input type="text" name="year">Year <input type="text" name="isbn">ISBN <input type="submit" value="STORE"> </pre></form> _END; exit();//AVsluta för att bespara serverkraft //vi kan jämföra knapparnas innehåll med serverns innehåll genom att först ange name='username' samt 'password' detta koms åt lätt av servern med hjälp av $_POST[] funktionen som sedan initierars i både knappen samt i serverns sökfunktion } $mysqli = new mysqli($hn, $un, $pw, $db); //referenser till all lagrade uppgifter i filen 'login.php' för att starta servern, detta lagras i variabeln '$mysqli' $title = $_POST['title']; //initierar '$username' med vad som tilldelas i den genom användning av $_POST[] $author = $_POST['author']; //initierar '$password' med vad som tilldelas i den genom initiering av $_POST[] $stmt = $mysqli->prepare("UPDATE classics SET title=? WHERE author=?");//prepared statement funktion, vi initierar '$stmt' med serverns '$mysqli' för att få åtkomst till databasen för att sedan kunna hänvisa att komma åt users14 var usernamn motsvarar ? som kommer att bidas med parameter senare, detsamma gäller för password. $stmt->bind_param("ss", $title, $author);//bind_param funktion som markerar genom 'ss' att det är två strängtyper vi initierar prepared statements med, i detta fall username samt password $stmt->execute();//vi exketerar prepared statements $stmt->store_result();//vi tilldelar resultat. if($stmt->num_rows > 0) {//om prepared statements 'stmt' motsvarar i rader mer än ingen rad då logga in med $_SESSION set to '$username' header('Location: userPage.php');//när vi kommit vidare tas vi till sidan userPage.php } else die("Invalid username/password combination"); //// if (isset($_POST['author']) && isset($_POST['title']) && isset($_POST['category']) && isset($_POST['year']) && isset($_POST['isbn'])) { $author = get_post($conn, 'author'); $title = get_post($conn, 'title'); $category = get_post($conn, 'category'); $year = get_post($conn, 'year'); $isbn = get_post($conn, 'isbn'); $query = "INSERT INTO classics VALUES" . "('$author', '$title', '$category', '$year', '$isbn')"; $result = $conn->query($query); if (!$result) echo "INSERT failed: $query<br>" . $conn->error . "<br><br>"; } // $query = "SELECT * FROM classics"; $result = $conn->query($query); if (!$result) die ("Database access failed: " . $conn->error); $rows = $result->num_rows; for ($j = 0 ; $j < $rows ; ++$j) { $result->data_seek($j); $row = $result->fetch_array(MYSQLI_NUM); echo <<<_END <pre> Author $row[0] Title $row[1] Category $row[2] Year $row[3] ISBN $row[4] </pre> <form action="sqltest.php" method="post"> <input type="hidden" name="delete" value="yes"> <input type="hidden" name="isbn" value="$row[4]"> <input type="submit" value="DELETE"></form> _END; } // echo <<<_END <form action="sqltest.php" method="post"> <pre> <input type="checkbox" name="category" value="Thriller">Thriller <input type="checkbox" name="category" value="Romantic">Romantic <input type="checkbox" name="category" value="Swedish">Swedish <input type="checkbox" name="category" value="Animated">Animated <input type="checkbox" name="category" value="Comedy" checked="checked">Comedy <input type="text" name="title">Title <input type="text" name="author">Author <input type="text" name="director">Director <input type="text" name="year">Year <input type="text" name="isbn">ISBN <input type="submit" value="STORE"> </pre></form> _END; $result->close(); $conn->close(); function get_post($conn, $var) { return $conn->real_escape_string($_POST[$var]); } ?> </div> </body> </html>

Permalänk

Prepared statements PHP MYSQL

Hej,

Jag har lyckats bra hittills att göra en function som visar vad min table I databasen innehåller samt skriver ut och kan skrivas in nya samt kan raderas, poroblemet blir när jag gör den till prepared statements får jag fatal error, jag försöker kolla men verkar inte kunna hitta felet.

Här är min kod

<?php // sqltest.php require_once 'login.php'; $conn = new mysqli($hn, $un, $pw, $db); if ($conn->connect_error) die($conn->connect_error); if (isset($_POST['delete']) && isset($_POST['isbn'])) { $isbn = get_post($conn, 'isbn'); $query = "DELETE FROM classics WHERE isbn='$isbn'"; $result = $conn->query($query); if (!$result) echo "DELETE failed: $query<br>" . $conn->error . "<br><br>"; } if (isset($_POST['author']) && isset($_POST['title']) && isset($_POST['type']) && isset($_POST['year']) && isset($_POST['isbn'])) { $author = get_post($conn, 'author'); $title = get_post($conn, 'title'); $type = get_post($conn, 'type'); $year = get_post($conn, 'year'); $isbn = get_post($conn, 'isbn'); $query = "INSERT INTO classics VALUES" . "('$author', '$title', '$type', '$year', '$isbn')"; $result = $conn->query($query); if (!$result) echo "INSERT failed: $query<br>" . $conn->error . "<br><br>"; } // $mysqli = new mysqli($hn, $un, $pw, $db); $type2 = 'Fiction'; //$query $query = $mysqli->prepare("SELECT * FROM classics WHERE type=?"); $query->bind_param("s", $type2); $query->execute(); $query->store_result(); $result = $conn->query($query); if (!$result) die ("Database access failed: " . $conn->error); $rows = $result->num_rows; for ($j = 0 ; $j < $rows ; ++$j) { $result->data_seek($j); $row = $result->fetch_array(MYSQLI_NUM); echo <<<_END <pre> Author $row[0] Title $row[1] Type $row[2] Year $row[3] ISBN $row[4] </pre> <form action="sqltest.php" method="post"> <input type="hidden" name="delete" value="yes"> <input type="hidden" name="isbn" value="$row[4]"> <input type="submit" value="DELETE"></form> _END; } // echo <<<_END <form action="sqltest.php" method="post"> <pre> <input type="checkbox" name="type" value="Thriller">Thriller <input type="checkbox" name="type" value="Romantic">Romantic <input type="checkbox" name="type" value="Swedish">Swedish <input type="checkbox" name="type" value="Animated">Animated <input type="checkbox" name="type" value="Comedy" checked="checked">Comedy <input type="text" name="title">Title <input type="text" name="author">Author <input type="text" name="director">Director <input type="text" name="year">Year <input type="text" name="isbn">ISBN <input type="submit" value="STORE"> </pre></form> _END; $result->close(); $conn->close(); function get_post($conn, $var) { return $conn->real_escape_string($_POST[$var]); } ?>

error kod "Warning: mysqli::query() expects parameter 1 to be string, object given in C:\Xampp\htdocs\Webb\sqltest.php on line 62
Database access failed: "

Vad är det exakt som är felet här?

Tackas för svar som kan fås

Permalänk
Medlem

Det felmeddelandet är väl ganska självförklarande? Metoden väntade sig en sträng som första argument, men du gav den ett objekt (av typen mysqli_stmt). Varför försöker du köra ditt query två gånger? Vill du inte snarare hämta resultatet från första gången du exekverade queryt ($query->execute();).
https://www.php.net/manual/en/mysqli-stmt.fetch.php

Visa signatur

Spela Swemantle! Du vet att du vill.

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

Permalänk
Skrivet av LemonIllusion:

Det felmeddelandet är väl ganska självförklarande? Metoden väntade sig en sträng som första argument, men du gav den ett objekt (av typen mysqli_stmt). Varför försöker du köra ditt query två gånger? Vill du inte snarare hämta resultatet från första gången du exekverade queryt ($query->execute();).
https://www.php.net/manual/en/mysqli-stmt.fetch.php

Ja du har rätt, detta verkar simpelt och kanske därför jag inte riktigt ser var felet ligger riktigt. Läste igenom vad du skrev men förstod inte riktigt exakt hur man fixar detta eller vad du riktigt menar. Kan du kanske ge ett exempel?

Permalänk
Medlem
Skrivet av naturaljoin:

Ja du har rätt, detta verkar simpelt och kanske därför jag inte riktigt ser var felet ligger riktigt. Läste igenom vad du skrev men förstod inte riktigt exakt hur man fixar detta eller vad du riktigt menar. Kan du kanske ge ett exempel?

Exempel finns i länken.

Visa signatur

Spela Swemantle! Du vet att du vill.

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

Permalänk
Skrivet av LemonIllusion:

Exempel finns i länken.

Som jag förstår är det denna jag bör fixa:

$result = $conn->query($query);

Kollade efter länken men vet inte riktigt vad som ska tas hänsyn till just där. Finns manga exemplarer men ingen verkar vara på som så sätt som jag gjort

Permalänk
Skrivet av LemonIllusion:

Exempel finns i länken.

gjorde detta

$result = $conn->mysqli_stmt($query);

fortfarande problem

Permalänk

någon som annan som förstår vad för fel det är? Har försökt ganska länga med att passa in andra parametrar men samma sak händer

Permalänk
Geeks
Jobbar med data

Problemet ligger som sagt i följande stycke.

$query = $mysqli->prepare("SELECT * FROM classics WHERE type=?"); $query->bind_param("s", $type2); $query->execute(); $query->store_result(); $result = $conn->query($query);

På rad 3 väljer du att "köra" den genom execute() funktionen. Och på rad 6 väljer du att köra en ->query igen, den här gången stoppar du in en object, fast den klarar bara strängar;

SELECT * FROM classics

https://www.php.net/manual/en/mysqli.query.php

Koden ska däremot vara:

$query = $mysqli->prepare("SELECT * FROM classics WHERE type=?"); $query->bind_param("s", $type2); $query->execute(); $result = $query->get_result();

Jag rekommenderar att du går över till $result->fetch_assoc() för att hämta informationen. Ifall du ändrar någon ordning på databaskolumerna så behöver du inte ändra nyckel när du hämtar ut dem med $row[0]... hela tiden. Utan man hämtar med $row['kolumn'] istället.
https://www.php.net/manual/en/mysqli-result.fetch-assoc.php

https://websitebeaver.com/prepared-statements-in-php-mysqli-t...

Permalänk
Skrivet av jreklund:

Problemet ligger som sagt i följande stycke.

$query = $mysqli->prepare("SELECT * FROM classics WHERE type=?"); $query->bind_param("s", $type2); $query->execute(); $query->store_result(); $result = $conn->query($query);

På rad 3 väljer du att "köra" den genom execute() funktionen. Och på rad 6 väljer du att köra en ->query igen, den här gången stoppar du in en object, fast den klarar bara strängar;

SELECT * FROM classics

https://www.php.net/manual/en/mysqli.query.php

Koden ska däremot vara:

$query = $mysqli->prepare("SELECT * FROM classics WHERE type=?"); $query->bind_param("s", $type2); $query->execute(); $result = $query->get_result();

Jag rekommenderar att du går över till $result->fetch_assoc() för att hämta informationen. Ifall du ändrar någon ordning på databaskolumerna så behöver du inte ändra nyckel när du hämtar ut dem med $row[0]... hela tiden. Utan man hämtar med $row['kolumn'] istället.
https://www.php.net/manual/en/mysqli-result.fetch-assoc.php

https://websitebeaver.com/prepared-statements-in-php-mysqli-t...

Hej, bra svar, jag provide det du skrev men fick ut nummer bara. Hur får jag ut innehållet jag normal frå när jag skriver utan prepared statements fast med prepared statements?

Permalänk

@jreklund: okej fattar nu, man kan inte använda prepared på SELECT * FROM

Permalänk
Geeks
Jobbar med data

Vill man använda prepared statements måste man använda sig utav $mysqli->prepare().

$conn->query() klarar bara rena SQL satser. Dvs SQL där du inte skickar in en extern parameter.

Vänligen läs sista länken jag skickade, den går igenom allt det här i detalj.

Permalänk

Prepared statement PHP MYSQL

Hej,

Jag har provat göra en kod prepared statement men den visar inte riktigt innehållet. Här är exempel på orginalet:

$query = "SELECT DISTINCT id,title,category,year,director FROM movies JOIN users"; $result = $conn->query($query); if (!$result) die ("Database access failed: " . $conn->error); $rows = $result->num_rows; for ($j = 0 ; $j < $rows ; ++$j) { $result->data_seek($j); $row = $result->fetch_array(MYSQLI_NUM); //Det finns rows som echo(ar) resultatet

Här är mitt försök av koden:

$query = $conn->prepare("SELECT DISTINCT id=?,title=?,category=?,year=?,director=? FROM movies JOIN users"); $query->bind_param("sssis", $id, $title, $type, $year, $director); $query->execute(); $rows = $query->num_rows; for ($j = 0 ; $j < $rows ; ++$j) { $query->data_seek($j); $row = $query->fetch_array(MYSQLI_NUM);

När jag kör mitt kod visas inget

Permalänk
Geeks
Jobbar med data

Ditt problem har inget med prepared statements att göra. Du bygger upp dina SQL satser fel.

Du kan inte göra "WHERE" inuti en SELECT
https://www.w3schools.com/sql/sql_where.asp