mySQL SELECT fråga
- SeniorLemuren
- Inlägg: 8332
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
mySQL SELECT fråga
Hur sjutton skriver man om man vill söka en post som innehåller en lång text med ett sökord.
Säg att jag vill öppna posten som innehåller ordet svets i strängen "blabla svets blabla bla mer svets."
Försöker jag med
$searchStr="svets"
SELECT * FROM my_info_table WHERE info LIKE " . '"' . $searchStr .'"';
Så går det inte. Men söker jag på hela strängen:
$searchStr="blabla svets blabla bla mer svets."
SELECT * FROM my_info_table WHERE info LIKE " . '"' . $searchStr .'"';
Så funkar det.
Säg att jag vill öppna posten som innehåller ordet svets i strängen "blabla svets blabla bla mer svets."
Försöker jag med
$searchStr="svets"
SELECT * FROM my_info_table WHERE info LIKE " . '"' . $searchStr .'"';
Så går det inte. Men söker jag på hela strängen:
$searchStr="blabla svets blabla bla mer svets."
SELECT * FROM my_info_table WHERE info LIKE " . '"' . $searchStr .'"';
Så funkar det.
- Klas-Kenny
- Inlägg: 11751
- Blev medlem: 17 maj 2010, 19:06:14
- Ort: Växjö/Alvesta
Re: mySQL SELECT fråga
Kod: Markera allt
SELECT * FROM my_info_table WHERE info LIKE " . '"%' . $searchStr .'%"';
Edit: oj, hade skrivit $ istället för %
Senast redigerad av Klas-Kenny 20 juni 2019, 13:26:37, redigerad totalt 1 gång.
Re: mySQL SELECT fråga
För att söka på delar av strängar använder man FULLTEXT index. Dom tar lång tid att skapa och kräver mycket lagringsutrymme men sen går det blixtsnabbt att söka.
https://dev.mysql.com/doc/refman/8.0/en ... dexes.html
https://dev.mysql.com/doc/refman/8.0/en ... dexes.html
- SeniorLemuren
- Inlägg: 8332
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
Re: mySQL SELECT fråga
Och innan du gör det, det där är ett bra exempel på "SQL injection".
Ett stort problem om man inte kan använda "SQL parameters" utan
måste hantera dynamiska SQL satser med stränghantering. Inte bra
i de fall att t.ex "svets" kommer från en hemsida där användaren
kan skriva vad som helst i ett formulär, t.ex ett DROP kommando...
Ditt exempel skulle kunna set ut ungefär så här:
Ungefär, otestad o.s.v. Här går det *inte* att använda johanos lilla "trick"...
Se mer på t.ex. https://www.php.net/manual/en/mysqli.prepare.php
Eller googla "php sql prepare statement".
Ett stort problem om man inte kan använda "SQL parameters" utan
måste hantera dynamiska SQL satser med stränghantering. Inte bra
i de fall att t.ex "svets" kommer från en hemsida där användaren
kan skriva vad som helst i ett formulär, t.ex ett DROP kommando...
Ditt exempel skulle kunna set ut ungefär så här:
Kod: Markera allt
$searchStr="%svets%"
/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT * FROM my_info_table WHERE info LIKE ?")) {
/* bind parameters for markers */
$stmt->bind_param("s", $searchStr);
/* execute query */
$stmt->execute();
...
...
}
Se mer på t.ex. https://www.php.net/manual/en/mysqli.prepare.php
Eller googla "php sql prepare statement".
- SeniorLemuren
- Inlägg: 8332
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
Re: mySQL SELECT fråga
Det jag håller på med nu är enbart en prototyp-app. Jag har inte så bra kunskaper om detta med "SQL injection" så det får bli ett senare problem när jag fått appen att fungera som jag tänkt. Avsikten är att köra den mot mySQL. Apache (XAMPP) lokalt i datorn. För tillfället kör jag den mot en internetserver bara för att kunna komma åt den när jag inte sitter hemma.
Re: mySQL SELECT fråga
Filtrera bort ; och andra specialtecken ur söksträngen så är du lite mer skyddad. Och kanske en maxgräns på 10 tecken?
- Housepainter
- EF Sponsor
- Inlägg: 1318
- Blev medlem: 19 juli 2006, 18:50:38
- Ort: Borås
Re: mySQL SELECT fråga

johano skrev:Prova sen med att söka på " '; DROP TABLE my_info_table;-- "
- Mickecarlsson
- EF Sponsor
- Inlägg: 4745
- Blev medlem: 15 april 2017, 18:06:15
- Ort: Malmö
- Kontakt:
Re: mySQL SELECT fråga
Se tills så att användaren som accessar databasen bara har de behörigheter som krävs.
GRANT SELECT, INSERT, DELETE ON database.* TO 'user'@'localhost';
Ska det bara sökas i databasen:
GRANT SELECT ON database.* TO 'user'@'localhost';
Som tillägg till de andra säkerhetsåtgärderna.
GRANT SELECT, INSERT, DELETE ON database.* TO 'user'@'localhost';
Ska det bara sökas i databasen:
GRANT SELECT ON database.* TO 'user'@'localhost';
Som tillägg till de andra säkerhetsåtgärderna.