Fulltext query probleem
hier de query:
Code (php)
1
SELECT * FROM links WHERE MATCH(title, description, keywords) AGAINST ('".$search."') AND (end_date IS NULL OR end_date > CURRENT_DATE( ) OR end_date = 0000-00-00) AS results
Deze variabele wordt dan uitgelezen via:
Als ik bovenstaande uitvoer, krijg ik een query-error.
Deze vrag heb ik al ook gedeeltelijk gesteld hier.
Christophe
end_date = 0000-00-00
0000-00-00 is een string maar zo defineer jij deze nu niet.
Maar het ergste is nog dat je aan de haal gaat met een ongeldige datum.
Als een datum onbekend is dan heeft die datum een waarde NULL en geen enkele andere waarde!
Overigens zorg voor een correcte foutafhandeling dan kan je tenminste ook de error posten, wat voor ons dan weer makkelijker is om jouw een draai om de oren te geven dat je hetzelf niet kunt oplossen.
Gewijzigd op 11/12/2010 16:15:06 door Noppes Homeland
Kun je me mss helpen hoe de waarde op NULL te plaatsen?
Ik heb een BackOffice gemaakt en als ik niks invul in het datumveld, wordt in MySQL automatisch '0000-00-00' geplaatst.
Zo leer ik ook nog iets bij.
De error die ik tezien krijg is deze:
ERROR: There was a problem with the query.
Hieronder zie je het script die wordt aangeroepen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
// PHP5 Implementation - uses MySQLi.
// mysqli('localhost', 'yourUsername', 'yourPassword', 'yourDatabase');
$db = new mysqli('localhost', 'root' ,'usbw', 'blinks');
if(!$db) {
// Show error if we cannot connect.
echo 'ERROR: Could not connect to the database.';
} else {
// Is there a posted query string?
if(isset($_POST['search'])) {
$search = $db->real_escape_string($_POST['search']);
// Is the string length greater than 0?
if(strlen($search) >0) {
// Run the query: We use LIKE '$search%'
// The percentage sign is a wild-card, in my example of countries it works like this...
// $search = 'Uni';
// Returned data = 'United States, United Kindom';
// YOU NEED TO ALTER THE QUERY TO MATCH YOUR DATABASE.
// eg: SELECT yourColumnName FROM yourTable WHERE yourColumnName LIKE '$search%' LIMIT 10
$search = $search.'*';
$query = $db->query("SELECT * FROM links WHERE MATCH(title, description, keywords) AGAINST ('".$search."' IN BOOLEAN MODE) AND (end_date IS NULL OR end_date > CURRENT_DATE( ) OR end_date = 0000-00-00) AS results");
if($query) {
// While there are results loop through them - fetching an Object (i like PHP5 btw!).
while ($result = $query ->fetch_object()) {
// Format the results, im using <li> for the list, you can change it.
// The onClick function fills the textbox with the result.
// YOU MUST CHANGE: $result->value to $result->your_colum
echo '<li onClick="fill('.$result->results.');">'.$result->results.'</li>';
}
} else {
echo 'ERROR: There was a problem with the query.';
}
} else {
// Dont do anything.
} // There is a search.
} else {
echo 'There should be no direct access to this script!';
}
}
?>
// PHP5 Implementation - uses MySQLi.
// mysqli('localhost', 'yourUsername', 'yourPassword', 'yourDatabase');
$db = new mysqli('localhost', 'root' ,'usbw', 'blinks');
if(!$db) {
// Show error if we cannot connect.
echo 'ERROR: Could not connect to the database.';
} else {
// Is there a posted query string?
if(isset($_POST['search'])) {
$search = $db->real_escape_string($_POST['search']);
// Is the string length greater than 0?
if(strlen($search) >0) {
// Run the query: We use LIKE '$search%'
// The percentage sign is a wild-card, in my example of countries it works like this...
// $search = 'Uni';
// Returned data = 'United States, United Kindom';
// YOU NEED TO ALTER THE QUERY TO MATCH YOUR DATABASE.
// eg: SELECT yourColumnName FROM yourTable WHERE yourColumnName LIKE '$search%' LIMIT 10
$search = $search.'*';
$query = $db->query("SELECT * FROM links WHERE MATCH(title, description, keywords) AGAINST ('".$search."' IN BOOLEAN MODE) AND (end_date IS NULL OR end_date > CURRENT_DATE( ) OR end_date = 0000-00-00) AS results");
if($query) {
// While there are results loop through them - fetching an Object (i like PHP5 btw!).
while ($result = $query ->fetch_object()) {
// Format the results, im using <li> for the list, you can change it.
// The onClick function fills the textbox with the result.
// YOU MUST CHANGE: $result->value to $result->your_colum
echo '<li onClick="fill('.$result->results.');">'.$result->results.'</li>';
}
} else {
echo 'ERROR: There was a problem with the query.';
}
} else {
// Dont do anything.
} // There is a search.
} else {
echo 'There should be no direct access to this script!';
}
}
?>
Zet er quotes omheen: '0000-00-00'
Toevoeging op 11/12/2010 18:13:01:
En echo de 'echte' error.
Ook volgende regel toegevoegd (na regel 38) om eventueel een error-bericht te zien:
Helaas wordt er geen bericht weergegeven, enkel 'ERROR: There was a problem with the query.'
Je werkt met mysqli dus dan krijg je geen error van mysql (zonder i).
Uiteindelijk werkt de query nu, daar ik deze heb aangepast:
Code (php)
1
$query = $db->query("SELECT title, description, keywords WHERE title LIKE '%$search%' OR description LIKE '%$search%' OR keywords LIKE '%$search%' AND (end_date IS NULL OR end_date > CURRENT_DATE( ) OR end_date = '0000-00-00') LIMIT 10");
Weet je eventueel hoe enkel de gevonden woorden kunnen 'getoont' worden, maar niet de gehele inhoud van een kolom?
Vb. als er gezocht wordt op 'ver', dan dient deze volgende resltaten te geven: 'versterking', 'verstandig', 'verkoop', ...
Ter info, dit is nodig voor een 'autoSuggest'-functie die ik van het net heb gehaald:
http://www.nodstrum.com/2007/09/19/autocompleter/
Toevoeging op 11/12/2010 19:42:03:
en is het mogelijk verschillende kolommen te combineren tot één kolom met de naam 'results'?
Dit is nodig voor volgende regel:
Toevoeging op 11/12/2010 20:09:13:
eigenlijk zou ik een tijdelijke kolom moeten kunnen aanmaken.