Permalänk
Medlem

PHP/mysql problem

Jag sitter och tragglar med php och frågor till sql men sliter mitt hår över detta som syns i min error.log

[02-Dec-2019 21:21:44 Europe/Stockholm] PHP Parse error: syntax error, unexpected '$sql' (T_VARIABLE) in /home/****/backend-search.php on line 7

Line 7:

$sql = "SELECT * FROM Namn WHERE Tele LIKE '$param_term'";

Ser någon vad felet är i min syntax?

Allt gott!

Permalänk
Medlem

Saknat semikolon på raden före?

Hur har du det med möjligheten till SQL injection i den där koden?

Permalänk
Medlem
Skrivet av KAD:

Saknat semikolon på raden före?

Hur har du det med möjligheten till SQL injection i den där koden?

Jag är extremt färsk på detta och försöker bara kopiera från tutorials. Så här ser hela koden ut:

<?php
$link = mysqli_connect("localhost", "*****", "*****", "tomorrow_fuskapa");
if ($link === false) {
die("ERROR: Could not connect. " . mysqli_connect_error());
}
if (isset($_REQUEST["term"])) {
​ $sql = "SELECT * FROM fuskapa WHERE Hand LIKE '$param_term'";
​​if ($stmt = mysqli_prepare($link, $sql)) {
​mysqli_stmt_bind_param($stmt, "s", $param_term);
​ $param_term = $_REQUEST["term"] . "%";
​if (mysqli_stmt_execute($stmt)) {
$result = mysqli_stmt_get_result($stmt);
​​if (mysqli_num_rows($result) > 0) {
​while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
echo "<p>" . $row["Hand"] . "</p>";
}
} else {
echo "<p>No matches found</p>";
}
} else {
echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
}
}
​mysqli_stmt_close($stmt);
}
mysqli_close($link);
?>

Permalänk

Om du använder copy paste så kan felet ligga i mellanslagen/tomrummen.

Visa signatur

i7 920 C0/C1, 12gb ddr3, GTX 1060.

Permalänk
Medlem
Skrivet av Peterpawn:

Om du använder copy paste så kan felet ligga i mellanslagen/tomrummen.

Ok! Just denna rad jag får error på har jag skrivit in i ett otal varianter manuellt dock

Permalänk
Medlem

Provat hårdkoda param_term i sql-satsen bara för att se att det funkar?

Exempelvis: SELECT * FROM namn WHERE Tele LIKE ’%something%’

Sedan kanske du har typo på Namn? Som bör vara name?

Skickades från m.sweclockers.com

Visa signatur

Monitor Acer Predator XB273UGX & ASUS ROG Swift PG279Q
Chassi Fractal Design Define 7 MB ASUS ROG Maximus Z790 HERO CPU Intel Core i9-13900KS (w/ TG Contact Frame) CPU-COOL ASUS Ryuo III (w/ Noctua NF-A12x15) GPU ASUS GeForce RTX 4090 24GB ROG Strix Gaming OC RAM Corsair Dominator Platinum RGB Black DDR5 6200MHz 2x16GB SSD Samsung 990 PRO 2TB + 2x Samsung 860 PRO 4TB PSU Corsair AX1200i

Permalänk
Skrivet av zencity:

Ok! Just denna rad jag får error på har jag skrivit in i ett otal varianter manuellt dock

Skriv om allt själv utan att kopiera.
Eller sudda tomrummen från början av varje rad

Visa signatur

i7 920 C0/C1, 12gb ddr3, GTX 1060.

Permalänk
Medlem
Skrivet av zencity:

Jag är extremt färsk på detta och försöker bara kopiera från tutorials. Så här ser hela koden ut:

Om du tittar på felmeddelandet och koden så talar den faktiskt om vad felet är, [02-Dec-2019 21:21:44 Europe/Stockholm] PHP Parse error: syntax error, unexpected '$sql' (T_VARIABLE) in /home/****/backend-search.php on line 7

if (isset($_REQUEST["term"])) {
Här säger koden att om formulärfältet term är satt gör följande fråga till databastabellen:
​ $sql = "SELECT * FROM fuskapa WHERE Hand LIKE '$param_term'";
men du har inte definierat vad $param_term är för något, om det ens är något, det måste du göra i din kod innan du ställer frågan.

ex. om $param_term ska ha samma värde som du skickat via formulärfältet term:

if (isset($_REQUEST["term"])) { $param_test = $_REQUEST["term"]; ​ $sql = "SELECT * FROM fuskapa WHERE Hand LIKE '$param_term'";

Sedan som @KAD är inne på, var uppmärksam på risken för SQL-injects i koden, här finns inget sådant skydd.

Visa signatur

Asus C6H | R9-3900XT | 4x8GB G-Skill Ripjaws V 3600@3466 CL14 | Asus Radeon RX 580 8GB Strix Gaming OC | Asus Strix Raid DLX | Corsair Obsidian 750D AE

Permalänk
Medlem
Skrivet av Johan_G3:

Om du tittar på felmeddelandet och koden så talar den faktiskt om vad felet är, [02-Dec-2019 21:21:44 Europe/Stockholm] PHP Parse error: syntax error, unexpected '$sql' (T_VARIABLE) in /home/****/backend-search.php on line 7

if (isset($_REQUEST["term"])) {
Här säger koden att om formulärfältet term är satt gör följande fråga till databastabellen:
​ $sql = "SELECT * FROM fuskapa WHERE Hand LIKE '$param_term'";
men du har inte definierat vad $param_term är för något, om det ens är något, det måste du göra i din kod innan du ställer frågan.

ex. om $param_term ska ha samma värde som du skickat via formulärfältet term:

if (isset($_REQUEST["term"])) { $param_test = $_REQUEST["term"]; ​ $sql = "SELECT * FROM fuskapa WHERE Hand LIKE '$param_term'";

Sedan som @KAD är inne på, var uppmärksam på risken för SQL-injects i koden, här finns inget sådant skydd.

Nu har jag fått det att fungera, delvis, det var att ställa in rätt i sql-instälningarna på webhosten. Jag klickade i nd_mysqli och nu får jag ajaxdrivna sökträffar när jag gör slagningar i frontend.

Men det händer inget mer än att jag får en träff på det sökta. Jag skulle vilja få en utskrift på hela raden som sökträffen är på.

Exempelvis om jag får sökträff på Hand så vill jag att hela raden för den sökträffen skrivs ut. Gärna i en Tabell med kolumnernas rubriker och resultatet på en rad under.

ID | Hand | Procent | KolumnX | KolumnY | KolumnZ | KolumnW
1 | Right | 23,3% | X | Y | Z | W

Jag misstänker att jag behöver skriva om här?

while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
echo "<p>" . $row["Hand"] . "</p>";

Permalänk
Medlem
Skrivet av zencity:

Nu har jag fått det att fungera, delvis, det var att ställa in rätt i sql-instälningarna på webhosten. Jag klickade i nd_mysqli och nu får jag ajaxdrivna sökträffar när jag gör slagningar i frontend.

Men det händer inget mer än att jag får en träff på det sökta. Jag skulle vilja få en utskrift på hela raden som sökträffen är på.

Exempelvis om jag får sökträff på Hand så vill jag att hela raden för den sökträffen skrivs ut. Gärna i en Tabell med kolumnernas rubriker och resultatet på en rad under.

ID | Hand | Procent | KolumnX | KolumnY | KolumnZ | KolumnW
1 | Right | 23,3% | X | Y | Z | W

Jag misstänker att jag behöver skriva om här?

while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
echo "<p>" . $row["Hand"] . "</p>";

Det finns många olika sätt att göra det hela på, scriptet du lade in tidigare, om jag nu inte förstått rätt i vad du vill göra är onödigt komplicerat, i början kan det vara bra att hålla allt så enkelt som bara går.

Jag lägger in en förenklad version här som exempel:

<?php /* Anslut till sql-servern. I stället för att skriva in anslutningen i varje enskilt PHP-script kan du skapa en textfil, t.ex "min_db_anslutning.inc" och lägga in via t.ex "include('min_db_anslutning.inc');" Skulle du då behöva ändra någonting ändrar du bara på ett ställe i stället för i varje script. */ $link = new mysqli("localhost", "*****", "*****", "tomorrow_fuskapa"); if ($link === false) { die("ERROR: Could not connect. " . mysqli_connect_error()); /* Definiera $param_term och ta bort backslash. Det finns andra methoder som är bättre för att undvika SQL-injects, men här håller jag det enkelt. */ $param_term = isset($_REQUEST["term"]) ? $_REQUEST["term"] : ""; $param_term = stripslashes($param_term); if (isset($_REQUEST["term"])) { // Om term är skickat, skapa tabell och tabellhuvud. echo "<table style='position:absolute; top:5%; left:15%; width:70%; border: 1px solid black; padding:4px;'> <tr><th> ID </th><th> Hand </th><th> Procent </th><th> KolumnX </th><th> KolumnY </th><th> KolumnZ </th><th> KolumnW </th></tr>"; echo "<tr><td style='border: 2px dotted gray;' colspan='7'>Sedan kommer fälten.</td></tr>"; //Skapa förfrågan till schemat och tabellen: $lista = mysqli_query($link,"SELECT * FROM fuskapa WHERE Hand LIKE '$param_term'"); while ($post = mysqli_fetch_array($lista)) { // skriv ut innehållet till tabellfälten. echo "<tr><td>".$post['ID']."</td><td>".$post['Hand']."</td><td>".$post['Procent']."</td><td>".$post['KolumnX']."</td><td>".$post['KolumnY']."</td><td>".$post['KolumnZ']."</td><td>".$post['KolumnW']."</td></tr>"; } echo "</table>"; } else { // Om term inte är skickad, skapa ett felmeddelande. echo "Du har inte ställt någon fråga!"; } ?>

Stavfel
Visa signatur

Asus C6H | R9-3900XT | 4x8GB G-Skill Ripjaws V 3600@3466 CL14 | Asus Radeon RX 580 8GB Strix Gaming OC | Asus Strix Raid DLX | Corsair Obsidian 750D AE

Permalänk
Medlem
Skrivet av Johan_G3:

Det finns många olika sätt att göra det hela på, scriptet du lade in tidigare, om jag nu inte förstått rätt i vad du vill göra är onödigt komplicerat, i början kan det vara bra att hålla allt så enkelt som bara går.

Jag lägger in en förenklad version här som exempel:

<?php /* Anslut till sql-servern. I stället för att skriva in anslutningen i varje enskilt PHP-script kan du skapa en textfil, t.ex "min_db_anslutning.inc" och lägga in via t.ex "include('min_db_anslutning.inc');" Skulle du då behöva ändra någonting ändrar du bara på ett ställe i stället för i varje script. */ $link = new mysqli("localhost", "*****", "*****", "tomorrow_fuskapa"); if ($link === false) { die("ERROR: Could not connect. " . mysqli_connect_error()); /* Definiera $param_term och ta bort backslash. Det finns andra methoder som är bättre för att undvika SQL-injects, men här håller jag det enkelt. */ $param_term = isset($_REQUEST["term"]) ? $_REQUEST["term"] : ""; $param_term = stripslashes($param_term); if (isset($_REQUEST["term"])) { // Om term är skickat, skapa tabell och tabellhuvud. echo "<table style='position:absolute; top:5%; left:15%; width:70%; border: 1px solid black; padding:4px;'> <tr><th> ID </th><th> Hand </th><th> Procent </th><th> KolumnX </th><th> KolumnY </th><th> KolumnZ </th><th> KolumnW </th></tr>"; echo "<tr><td style='border: 2px dotted gray;' colspan='7'>Sedan kommer fälten.</td></tr>"; //Skapa förfrågan till schemat och tabellen: $lista = mysqli_query($link,"SELECT * FROM fuskapa WHERE Hand LIKE '$param_term'"); while ($post = mysqli_fetch_array($lista)) { // skriv ut innehållet till tabellfälten. echo "<tr><td>".$post['ID']."</td><td>".$post['Hand']."</td><td>".$post['Procent']."</td><td>".$post['KolumnX']."</td><td>".$post['KolumnY']."</td><td>".$post['KolumnZ']."</td><td>".$post['KolumnW']."</td></tr>"; } echo "</table>"; } else { // Om term inte är skickad, skapa ett felmeddelande. echo "Du har inte ställt någon fråga!"; } ?>

Wow! Vilket riktigt pangsvar. Tack så hemskt mycket

Jag ser fram emot att prova detta. Behöver jag stänga connection också?

Jag provade att skriva in de jag hade i min föregående kod men får fel på sista raden i koden.

[04-Dec-2019 20:21:37 Europe/Stockholm] PHP Parse error: syntax error, unexpected end of file in /home/tomorrow/public_html/fuskapa/backend-search.php on line 39

Så här provade jag att avsluta:

// Om term inte är skickad, skapa ett felmeddelande.

echo "Du har inte ställt någon fråga!";
}
​mysqli_stmt_close($stmt);
}
mysqli_close($link);
?>

Permalänk
Medlem

@zencity:
Sorry för lite sent svar.

Citat:

Behöver jag stänga connection

Är det bra att stänga anlutningen? Ja
Är det viktigt att stänga anslutningen? Det kan vara det.
Är det nödvändigt att stänga anslutningen? Njaee det beror på...

SQL-servern tillåter bara ett visst antal samtidiga anslutningar, hur många går att ändra i my.cnf (my.ini under Windows-baserad installation). Att stänga anslutningen är det rätta att göra och om du t.ex. har en lite större sida eller många olika sidor eller klienter som ansluter kan det vara viktigt att stänga anslutningen för att inte servern ska gå på knäna, är det "bara" en mindre utvecklignsserver spelar det mindre roll, efter en liten stund stänger servern av inaktiva anslutningar ändå, också denna tid går att ändra in i config-filen vid behov.

Ang. Felmeddelandet:

[04-Dec-2019 20:21:37 Europe/Stockholm] PHP Parse error: syntax error, unexpected end of file in /home/tomorrow/public_html/fuskapa/backend-search.php on line 39

Testkörde just scriptet och får inga sådana fel här, men eftersom det bara är 38 rader kan det vara om du skrivit in något annat eller råkat lägga till en radmatning eller liknande.

Om du skriver i Windows-miljö kan jag rekommendera dig att använda Notepad++ om du inte redan gör det. I det programmet brukar det vara ganska enkelt att hitta den typen av fel.
Notepad++ är för övrigt kostnadsfritt.

Visa signatur

Asus C6H | R9-3900XT | 4x8GB G-Skill Ripjaws V 3600@3466 CL14 | Asus Radeon RX 580 8GB Strix Gaming OC | Asus Strix Raid DLX | Corsair Obsidian 750D AE