Vill du vara del av diskussionerna i forumet, ställa frågor eller hjälpa andra? Registrera dig här!
Trädvy Permalänk
Medlem
Plats
STHLM
Registrerad
Jul 2009

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!

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

Saknat semikolon på raden före?

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

Trädvy Permalänk
Medlem
Plats
STHLM
Registrerad
Jul 2009
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);
?>

Trädvy Permalänk
Medlem
Plats
Knivsta
Registrerad
Nov 2009

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

i7 920 C0/C1 @3.7, Gigabyte EX58-UD4P, 8gb ddr3, GTX 1060, define c, corsair tx650w, asus Xonar dx, Dell U2412M + Asus 24"

Trädvy Permalänk
Medlem
Plats
STHLM
Registrerad
Jul 2009
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

Trädvy Permalänk
Medlem
Plats
Malmö
Registrerad
Mar 2005

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

Monitor ASUS ROG Swift PG279Q
Chassi Fractal Design Define S MB ASUS ROG Maximus X HERO Z370 CPU Intel Core i9-9900KS CPU-COOL Fractal Design Celsius S36 GPU ASUS GeForce RTX 2080 Ti ROG Strix OC 11GB RAM Corsair Vengeance LPX 2x8GB 3000MHZ SSD Samsung 970 EVO Plus 1TB HDD 4x4TB AUDIO ASUS Strix Raid DLX PSU Corsair AX1200i

Trädvy Permalänk
Medlem
Plats
Knivsta
Registrerad
Nov 2009
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

i7 920 C0/C1 @3.7, Gigabyte EX58-UD4P, 8gb ddr3, GTX 1060, define c, corsair tx650w, asus Xonar dx, Dell U2412M + Asus 24"

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Jul 2015
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.

Asus C6H | R7-1700X | 4x8GB G-Skill Ripjaws V 3600@3466 CL14 | Asus Radeon RX 580 8GB Strix Gaming OC | Asus Strix Raid DLX | Corsair Obsidian 750D AE | https://valid.x86.fr/yckrqb

Trädvy Permalänk
Medlem
Plats
STHLM
Registrerad
Jul 2009
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>";

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Jul 2015
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

Asus C6H | R7-1700X | 4x8GB G-Skill Ripjaws V 3600@3466 CL14 | Asus Radeon RX 580 8GB Strix Gaming OC | Asus Strix Raid DLX | Corsair Obsidian 750D AE | https://valid.x86.fr/yckrqb

Trädvy Permalänk
Medlem
Plats
STHLM
Registrerad
Jul 2009
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);
?>

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Jul 2015

@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.

Asus C6H | R7-1700X | 4x8GB G-Skill Ripjaws V 3600@3466 CL14 | Asus Radeon RX 580 8GB Strix Gaming OC | Asus Strix Raid DLX | Corsair Obsidian 750D AE | https://valid.x86.fr/yckrqb