Avatar billede dhunters Nybegynder
11. august 2004 - 12:05 Der er 27 kommentarer og
4 løsninger

Søg i flere rækker i MySQL

Hej alle.

Jeg er ved at lave lidt "sjov" søgning og skal søge i to tekstfelter og to intervaller. Dvs. at man skal kunne skrive to ord i to forskellige felter samt i fire andre felter kunne skrive 2x2 tal. Herefter skal man kunne søge og nu skal der kun komme de forekomster frem som indeholder de to ord, og ligger mellem de to intervaller.
Håber nogle vil være behjælpelige.

/dhunters
Avatar billede detox Nybegynder
11. august 2004 - 12:36 #1
Hvor langt er du nået?
Avatar billede dhunters Nybegynder
11. august 2004 - 12:50 #2
har en tabel med felterne tekst1 og tekst2 begge TEXT og tal1 og tal2 begge INT. Er igang med at prøve at lave noget fidilihøj med faste værdier men der kommer kun en blank side
Avatar billede detox Nybegynder
11. august 2004 - 12:54 #3
Men har du ikke lavet en form? Hvad hedder tabellen og de 4 felter?
Avatar billede detox Nybegynder
11. august 2004 - 13:01 #4
Eller rettere 6 felter...
Avatar billede dhunters Nybegynder
11. august 2004 - 13:13 #5
search2-1.php:
<html>
<body>
<p>Søg</p>
<form method=post action="search2-2.php">
<p>intervalstart1.1: <input type=text name=tal11></p>
<p>intervalstart1.2: <input type=text name=tal12></p>
<p>intervalstart2.1: <input type=text name=tal21></p>
<p>intervalstart2.2: <input type=text name=tal22></p>
<input type=submit value=" Søg ">
</form>
</body>
</html>

search2-2.php:
<html>
<body>
<?php
$db = mysql_connect("mysql5.wannafind.dk","matras_sol","xenhp58s")or die("Der var en MySQL fejl: " . mysql_error());
mysql_select_db("matras_solutions_dk_db",$db)or die("Der var en MySQL fejl: " . mysql_error());
$foresp = mysql_query("SELECT tekst1, tekst2, tal1, tal2 FROM test WHERE %$tal11%<=tal1<=%$tal12% AND %$tal21%<=tal2<=%$tal22%");
while($data = mysql_fetch_array($foresp)){

echo "$data[0] $data[1]";

}
?>
</body>
</html>
Avatar billede jasman Nybegynder
11. august 2004 - 13:13 #6
Håber at følgende SQL-statemenet kan hjælpe dig på vej.

SELECT tekst1,tekst2,tal1,tal2 from TABEL
  where søgekriterie1 >= tal1 AND søgekriterie2 <= tal1 AND
        søgekriterier3 >= tal2 AND søgekriterie4 <= tal2 AND
        MATCH(søgekriterie5) AGAINST tekst1 AND
        MATCH(søgekriterie6) AGAINST tekst2;

Søgekriterie1 - søgekriterie4 er dine talfelter &
Søgekriterie5 - søgekriterie6 er dine tekstfelter !!!

Se evt.
http://dev.mysql.com/doc/mysql/en/Fulltext_Search.html
Avatar billede dhunters Nybegynder
11. august 2004 - 13:14 #7
er kun igang med tallene indtil videre...
Avatar billede dhunters Nybegynder
11. august 2004 - 13:15 #8
@jasman -> jeg tjekker det ud! :) ser umiddelbart godt ud!
Avatar billede detox Nybegynder
11. august 2004 - 13:16 #9
Fx:

<?php
if (isset($_POST['submit'])) {
    require 'db.php'; // Forbindelse til databasen
    $res = mysql_query("select * from tabel where tekst1 like '%$_POST[tekst1]%' and tekst2 like '%$_POST[tekst2]%' and nr1 between '$_POST[fra1]' and '$_POST[til1]' and nr2 between '$_POST[fra2]' and '$_POST[til2]'") or die (mysql_error());
    while ($row = mysql_fetch_assoc($res)) {
        echo "$row[tekst1] $row[tekst2] $row[nr1] $row[nr2] <br />";
    }
}
?>
<form method="post" name="<?php echo $_SERVER['PHP_SELF']?>">
<div>
<label for="tekst1">1. ord:</label>
<input type="text" name="tekst1" id="tekst1" />
<label for="fra1">Fra:</label>
<input type="text" name="fra1" id="fra1" />
<label for="til1">Til:</label>
<input type="text" name="til1" id="til1" />
</div><div>
<label for="tekst2">2. ord:</label>
<input type="text" name="tekst2" id="tekst2" />
<label for="fra2">Fra:</label>
<input type="text" name="fra2" id="fra2" />
<label for="til2">Til:</label>
<input type="text" name="til2" id="til2" />
</div><div>
<input type="submit" name="submit" id="submit" value="S&oslash;g i databasen" />
</div>
</form>
Avatar billede detox Nybegynder
11. august 2004 - 13:18 #10
Ok, du må lige rette tabel og feltnavne.
Avatar billede jasman Nybegynder
11. august 2004 - 13:20 #11
Vil forresten råde dig til at ændre passwordet på din base, nu hvor du har offentligtgjort dit pw og dbbruger for samtlige bruger af eksperten.

:O
Avatar billede dhunters Nybegynder
11. august 2004 - 13:22 #12
fuck! jatak, jasman!
Avatar billede dhunters Nybegynder
11. august 2004 - 13:33 #13
ok... nu melder den fejl i dette:
$foresp = mysql_query("SELECT tekst1, tekst2, tal1, tal2 FROM test WHERE søgekriterie1 >= tal1 AND søgekriterie2 <= tal1 AND søgekriterie3 >= tal2 AND søgekriterie4 <= tal2 AND MATCH(søgekriterie5) AGAINST tekst1 AND MATCH(søgekriterie6) AGAINST tekst2");
while($data = mysql_fetch_array($foresp)){
Avatar billede detox Nybegynder
11. august 2004 - 13:34 #14
Du skal nok lige tjekke at alle felter er udfyldt. Prøv:

<form method="post" name="<?php echo $_SERVER['PHP_SELF']?>">
<div>
<label for="tekst1">1. ord:</label>
<input type="text" name="tekst1" id="tekst1" />
<label for="fra1">Fra:</label>
<input type="text" name="fra1" id="fra1" />
<label for="til1">Til:</label>
<input type="text" name="til1" id="til1" />
</div><div>
<label for="tekst2">2. ord:</label>
<input type="text" name="tekst2" id="tekst2" />
<label for="fra2">Fra:</label>
<input type="text" name="fra2" id="fra2" />
<label for="til2">Til:</label>
<input type="text" name="til2" id="til2" />
</div><div>
<input type="submit" name="submit" id="submit" value="S&oslash;g i databasen" />
</div>
</form>
<?php
if (isset($_POST['submit'])) {
    $keys = array('tekst1','tekst2','fra1','til1','fra2','til2');
    foreach ($keys as $val) {
        if ($_POST[$val] == '') die('Du har ikke udfyldt alle felter');
    }
    require 'db.php'; // Forbindelse til databasen
    $res = mysql_query("select * from test where tekst1 like '%$_POST[tekst1]%' and tekst2 like '%$_POST[tekst2]%' and (tal1 between '$_POST[fra1]' and '$_POST[til1]') and (tal2 between '$_POST[fra2]' and '$_POST[til2]')") or die (mysql_error());
    while ($row = mysql_fetch_assoc($res)) {
        echo "$row[tekst1] $row[tekst2] $row[tal1] $row[tal2] <br />";
    }
}
?>
Avatar billede dhunters Nybegynder
11. august 2004 - 13:39 #15
nejnej... den kommer fint videre (bruger jasmans lige nu)... og man skal også kunne lade felter stå tomt
Avatar billede jasman Nybegynder
11. august 2004 - 13:48 #16
$foresp = mysql_query("SELECT tekst1, tekst2, tal1, tal2 FROM test WHERE %$tal11% <= tal1 AND %$tal12% >= tal1 AND %$tal13% <= tal2 AND %$tal14% >= tal2 AND MATCH(tekst1) AGAINST ('%$tekst11%') AND MATCH(tekst2) AGAINST ('%$tekst22%');
while($data = mysql_fetch_array($foresp)){

HUSK AT INTRODUCERE TO FELTER TIL TEKSTFELTERNE I DIN FORM

<p>Søgeord1: <input type=text name=tekst11></p>
<p>Søgeord2: <input type=text name=tekst22></p>

ALTSÅ:


search2-1.php:
<html>
<body>
<p>Søg</p>
<form method=post action="search2-2.php">
<p>intervalstart1.1: <input type=text name=tal11></p>
<p>intervalstart1.2: <input type=text name=tal12></p>
<p>intervalstart2.1: <input type=text name=tal21></p>
<p>intervalstart2.2: <input type=text name=tal22></p>
<p>Søgeord1: <input type=text name=tekst11></p>
<p>Søgeord2: <input type=text name=tekst22></p>
<input type=submit value=" Søg ">
</form>
</body>
</html>

search2-2.php:
<html>
<body>
<?php
$db = mysql_connect("mysql5.wannafind.dk","matras_sol","xenhp58s")or die("Der var en MySQL fejl: " . mysql_error());
mysql_select_db("matras_solutions_dk_db",$db)or die("Der var en MySQL fejl: " . mysql_error());
$foresp = mysql_query("SELECT tekst1, tekst2, tal1, tal2 FROM test WHERE %$tal11% <= tal1 AND %$tal12% >= tal1 AND %$tal13% <= tal2 AND %$tal14% >= tal2 AND MATCH(tekst1) AGAINST ('%$tekst11%') AND MATCH(tekst2) AGAINST ('%$tekst22%');
while($data = mysql_fetch_array($foresp)){
echo "$data[0] $data[1]";

}
?>
</body>
</html>
Avatar billede dhunters Nybegynder
11. august 2004 - 13:48 #17
okay...
@detox: din (efter rettelse) melder denne fejl: (der er ikke indtastet tekst)
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ') AGAINST tekst1 AND MATCH() AGAINST tekst2' at line 1
Avatar billede detox Nybegynder
11. august 2004 - 13:50 #18
Ok, jeg vil nu ikke anbefale fulltext søgning i dette tilfælde. Men hvis du vil bruge det, så læs afsnittet om fulltext grundigt. Da du så skal lave fulltext index på dine felter og du skal osse være særlig opmærksom på brugen af stopwords.
Avatar billede detox Nybegynder
11. august 2004 - 13:52 #19
Det med tomme felter i din form forstår jeg heller ikke. Du skriver jo:
'... og nu skal der kun komme de forekomster frem som indeholder de to ord, og ligger mellem de to intervaller'
Avatar billede dhunters Nybegynder
11. august 2004 - 13:54 #20
hehe... detox, du har citeret mig korrekt :) men det er vist en tanketorsk... Det er kun hvis der er ord indtastet at forekomsterne skal indeholder de to ord!
Avatar billede detox Nybegynder
11. august 2004 - 13:59 #21
Tja, så fjerner du bare:

    $keys = array('tekst1','tekst2','fra1','til1','fra2','til2');
    foreach ($keys as $val) {
        if ($_POST[$val] == '') die('Du har ikke udfyldt alle felter');
    }

så skulle den virke efter hensigten (hvis altså du ikke retter andet i den) ;O)
Avatar billede dhunters Nybegynder
11. august 2004 - 14:54 #22
@jasman: det seneste du skrev giver denne fejl:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/www.matras-solutions.dk/www/search2-2.php on line 7
Avatar billede jasman Nybegynder
11. august 2004 - 14:58 #23
Lad os lige se koden.
Avatar billede dhunters Nybegynder
11. august 2004 - 15:02 #24
search2-1.php:
<html>
<body>
<p>Søg</p>
<form method=post action="search2-2.php">
<p>intervalstart1.1: <input type=text name=tal11></p>
<p>intervalstart1.2: <input type=text name=tal12></p>
<p>intervalstart2.1: <input type=text name=tal21></p>
<p>intervalstart2.2: <input type=text name=tal22></p>
<p>Søgeord1: <input type=text name=tekst11></p>
<p>Søgeord2: <input type=text name=tekst22></p>
<input type=submit value=" Søg ">
</form>
</body>
</html>

search2-2.php:
<html>
<body>
<?php
$db = mysql_connect("host","XXX","XXX")or die("Der var en MySQL fejl: " . mysql_error());
mysql_select_db("db",$db)or die("Der var en MySQL fejl: " . mysql_error());
$foresp = mysql_query("SELECT tekst1, tekst2, tal1, tal2 FROM test WHERE %$tal11% <= tal1 AND %$tal12% >= tal1 AND %$tal13% <= tal2 AND %$tal14% >= tal2 AND MATCH(tekst1) AGAINST ('%$tekst11%') AND MATCH(tekst2) AGAINST ('%$tekst22%')");
while($data = mysql_fetch_array($foresp)){

echo "$data[0] $data[1]";

}
?>
</body>
</html>
Avatar billede jasman Nybegynder
11. august 2004 - 15:06 #25
Har du en MSN installeret ?
Avatar billede dhunters Nybegynder
11. august 2004 - 15:11 #26
ja, timm_daniel@hotmail.com
Avatar billede dhunters Nybegynder
11. august 2004 - 16:17 #27
okay... nu er siden resultatsiden blank! har disse filer:

search2-1.php:
<html>
<body>
<p>Søg</p>
<form method=post action="search2-2.php">
<p>intervalstart1.1: <input type=text name=tal11></p>
<p>intervalstart1.2: <input type=text name=tal12></p>
<p>intervalstart2.1: <input type=text name=tal21></p>
<p>intervalstart2.2: <input type=text name=tal22></p>
<p>Søgeord1: <input type=text name=tekst11></p>
<p>Søgeord2: <input type=text name=tekst22></p>
<input type=submit value=" Søg ">
</form>
</body>
</html>

search2-2.php:
<html>
<body>
<?php
$db = mysql_connect("host","XXX","XXX")or die("Der var en MySQL fejl: " . mysql_error());
mysql_select_db("db",$db)or die("Der var en MySQL fejl: " . mysql_error());
$foresp = mysql_query("SELECT tekst1, tekst2, tal1, tal2 FROM test WHERE $_POST[tal11] <= tal1 <= $_POST[tal12] AND $_POST[tal21] <= tal2 <= $_POST[tal22] AND MATCH(tekst1) AGAINST ('$_POST[tekst11]') AND MATCH(tekst2) AGAINST ('$_POST[tekst22]')");
while($data = mysql_fetch_array($foresp)){

echo "$data[0] $data[1]";
}
?>
</body>
</html>
Avatar billede dhunters Nybegynder
11. august 2004 - 20:50 #28
Nogen der har en idé om hvordan det kan komme til at fungere?
Avatar billede detox Nybegynder
11. august 2004 - 20:53 #29
<form method="post" name="<?php echo $_SERVER['PHP_SELF']?>">
<div>
<label for="tekst1">1. ord:</label>
<input type="text" name="tekst1" id="tekst1" />
<label for="fra1">Fra:</label>
<input type="text" name="fra1" id="fra1" />
<label for="til1">Til:</label>
<input type="text" name="til1" id="til1" />
</div><div>
<label for="tekst2">2. ord:</label>
<input type="text" name="tekst2" id="tekst2" />
<label for="fra2">Fra:</label>
<input type="text" name="fra2" id="fra2" />
<label for="til2">Til:</label>
<input type="text" name="til2" id="til2" />
</div><div>
<input type="submit" name="submit" id="submit" value="S&oslash;g i databasen" />
</div>
</form>
<?php
if (isset($_POST['submit'])) {
    require 'db.php'; // Forbindelse til databasen
    $res = mysql_query("select * from test where tekst1 like '%$_POST[tekst1]%' and tekst2 like '%$_POST[tekst2]%' and (tal1 between '$_POST[fra1]' and '$_POST[til1]') and (tal2 between '$_POST[fra2]' and '$_POST[til2]')") or die (mysql_error());
    while ($row = mysql_fetch_assoc($res)) {
        echo "$row[tekst1] $row[tekst2] $row[tal1] $row[tal2]<br />";
    }
}
?>
Avatar billede dhunters Nybegynder
12. august 2004 - 09:42 #30
detox! Nu er den jo ved at fungere! Det er jo helt genialt... :)
Man hvis jeg nu kun indtaster værdier i "fra1" og "til1" så bliver siden bare blank - kan man gøre så man ikke skal indtaste i alle felter?
Avatar billede dhunters Nybegynder
12. august 2004 - 10:19 #31
Sådan... Nu duer skidtet! Sad lige og rodede med lidt if og else, og til sidst gik kabalen op.
Deler pointene ud - brugte noget af detox' svar, men jasman hjalp godt til undervejs!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester