PHP - Skicka parameter till databas

Permalänk
Medlem

PHP - Skicka parameter till databas

Försöker skicka data till en databas och välja ut en post.

Får följande felmeddelande:

Notice: Use of undefined constant Typ - assumed 'Typ' in C:\workspace\phpdemo\html\Search2\inc\uppdatera.php on line 11 Notice: Undefined index: Typ in C:\workspace\phpdemo\html\Search2\inc\uppdatera.php on line 11

Formuläret:

<form class="navbar-form navbar-left" role="search" action="inc/uppdatera.php" name="Typ" title="Typ" method="post" style="background-color:"> <div> <div class="form-group"> <input type="text" class="form-control pull-left" placeholder="Sök artikel" id="searchInput"> </div> <button type="submit" class="btn btn-default"><span class="fa fa-search"></span></button> </div> </form>

<?php try { $dbh = new PDO('mysql:host=localhost;dbname=artiklardb', 'root', 'MySQL'); //Försöker ansluta } catch (PDOExeption $exeption) { echo "Connection error: " . $exeption->getMessage(); } $name = $_POST[Typ]; echo $name; $sql = "SELECT * FROM books5 WHERE genre = '$name'"; $smtp = $dbh -> prepare($sql); //Förbereder att utföra SQL. $smtp -> execute(); //´Kör SQL foreach($smtp as $heroData){ echo '<tbody>'; echo '<tr>'; //echo '<th scope="row" class="text-center"><img class="img img-thumbnail text-center" src="',$heroData['image'], '" alt="Sports"></img></th>'; echo '<th scope="row" class="text-center"><img class="img img-thumbnail text-center" src="http://lorempixel.com/140/140/sports/1" alt="Sports"></th>'; echo '<td>',$heroData['author'],'</td>'; echo '<td>',$heroData['title'],'</td>'; echo '<td>',$heroData['genre'],'</td>'; echo '<td class="text-right">', $heroData['price'],'</td>'; echo '<td class="text-center">', $heroData['datePublish'],'</td>'; echo '<td>',$heroData['description'],'</td>'; echo '</tr>'; echo '</tbody>'; }

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk

$name = $_POST[Typ];

du måste ha fnuttar runt Typ, $name = $_POST["Typ"];

Permalänk
Medlem

Ok, tack!

Nu försvann det ena felmeddelandet, men det andra är kvar:

Notice: Undefined index: Typ in C:\workspace\phpdemo\html\Search2\inc\uppdatera.php on line 11

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Legendarisk
Skrivet av Larsp777:

Notice: Use of undefined constant Typ - assumed 'Typ' in C:\workspace\phpdemo\html\Search2\inc\uppdatera.php on line 11

Du använder "Typ" som en konstant när du försöker hämta värdet från arrayen. PHP försöker först hitta en konstant med det namnet för att använda dess värde, och när det misslyckas faller det tillbaks till att använda namnet som en sträng med den här varningen. Du ska sätta det inom citationstecken: $_POST["Typ"].

Skrivet av Larsp777:

Notice: Undefined index: Typ in C:\workspace\phpdemo\html\Search2\inc\uppdatera.php on line 11

Nästa felmeddelande beror på att $_POST inte innehåller något värde för "Typ". Innan du försöker hämta det måste du kontrollera om det existerar, och du bör även kontrollera att värdet är en sträng (formulärdata kan vara arrayer) och att det uppfyller övriga krav på längd, teckenkodning och liknande:

$name = isset($_POST["Typ"]) ? $_POST["Typ"] : null;

Orsaken till att det inte är satt trots att formuläret är skickat är att du har satt namn-attributet på hela formuläret istället för fältet. Flytta <form name="Typ" till <input name="Typ".

Skrivet av Larsp777:

$name = $_POST[Typ]; $sql = "SELECT * FROM books5 WHERE genre = '$name'"; $smtp = $dbh -> prepare($sql); //Förbereder att utföra SQL. $smtp -> execute(); //´Kör SQL

Här får du problem om användaren fyller i en genre vars innehåll påverkar frågans struktur (SQL injection), var noga med att alltid formatera innehåll för att passa sammanhanget. För databaser som har stöd för det undviker du lämpligen problemet genom att använda prepared statements och skicka värdena separat istället:

$sth = $dbh->prepare("SELECT * FROM `books5` WHERE `genre` = :name;"); $sth->bindValue(":name", $name); $sth->execute();

Skrivet av Larsp777:

foreach($smtp as $heroData){ echo '<tbody>'; echo '<tr>'; //echo '<th scope="row" class="text-center"><img class="img img-thumbnail text-center" src="',$heroData['image'], '" alt="Sports"></img></th>'; echo '<th scope="row" class="text-center"><img class="img img-thumbnail text-center" src="http://lorempixel.com/140/140/sports/1" alt="Sports"></th>'; echo '<td>',$heroData['author'],'</td>'; echo '<td>',$heroData['title'],'</td>'; echo '<td>',$heroData['genre'],'</td>'; echo '<td class="text-right">', $heroData['price'],'</td>'; echo '<td class="text-center">', $heroData['datePublish'],'</td>'; echo '<td>',$heroData['description'],'</td>'; echo '</tr>'; echo '</tbody>'; }

Som ovan, fundera på vad som händer om något av dina fält innehåller uppgifter som kan tolkas som HTML. Här bör du använda htmlspecialchars() för att säkerställa att tecken som har särskild betydelse i HTML presenteras för användaren som text istället för att tolkas av webbläsaren.

Visa signatur

Abstractions all the way down.

Permalänk
Medlem

Tack! Vet att det inte är så säkert men detta är för en kurs och vi kommer nog att prata säkerhet senare.

Har mest hållit på med C# och en del ASP.NET Webforms. Så att använda PHP känns lite ovant.

Har fått det att fungera så långt att resultatet visas.

Det är så här också att en annan lärare har gjort en sida där man både söker ifrån och där resultaten ska redovisas.

Jag återvänder till söksidan med:

header("Location: http://localhost:1234/search2/search-results.php"); exit;

Frågan är dock hur jag får med mig resultatet tillbaka till sidan och kan visa det formaterat där.

Den foreach-sats som jag kör är meningen att jag ska includera på den andra sidan, så formateringen är väl just nu onödig.

Har ett annat PHP-sikript där jag söker i hela tabellen och där jag också har formateringen. Denna inkuderar jag bara på söksidan med <include> och det fungerar bra. När jag använder skriptet för att söka efter en specifik post aktiverar jag ju skriptet genom formulärets "action". Då går man ju dit och kör frågan.

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10