Ik heb een script vervaardigd door Ger van Steenderen:

<?php
function match_Combo_zoeken($een, $twee, $drie, $vier, $vijf) {

global $match_zoeken;

$match_zoeken = $mysqli->query("SELECT
vid.id,
v.Naam_Functie,
Locatie,
COUNT(*) AS total_matches,
GROUP_CONCAT(vid.matched_word) AS matched_words
FROM
(SELECT
id,
'$een' AS matched_word
FROM
vacatures
WHERE
Naam_Functie LIKE '%$een%'
UNION
SELECT
id,
'$twee' AS matched_word
FROM
vacatures
WHERE
Locatie LIKE '%$twee%'
UNION
SELECT
id,
'$drie' AS matched_word
FROM
vacatures
WHERE
Functie_Omschrijving LIKE '%$drie%'
UNION
SELECT
id,
'$vier' AS matched_word
FROM
vacatures
WHERE
Werkervaring LIKE '%$vier%'
UNION
SELECT
id,
'$vijf' AS matched_word
FROM
vacatures
WHERE
Arbeidsvoorwaarden LIKE '%$vijf%'
) AS vid
INNER JOIN
vacatures AS v
ON
vid.id = v.id
GROUP BY vid.id
ORDER BY total_matches DESC"); }
?>

Dan heb ik inputs:
<?php
if (isset($_POST['match_zelf'])) {

if (isset($_POST['match_functie']) || isset($_POST['match_locatie']) ||
isset($_POST['match_omschrijving']) || isset($_POST['match_eisen']) ||
isset($_POST['match_voorwaarden'])) {

$match_functie = $_POST['match_functie'];
$match_locatie = $_POST['match_locatie'];
$match_omschrijving = $_POST['match_omschrijving'];
$match_eisen = $_POST['match_eisen'];
$match_voorwaarden = $_POST['match_voorwaarden'];
}
$perc = match_Combo_zoeken($match_functie , $match_locatie, $match_omschrijving, $match_eisen, $match_voorwaarden);
}
?>

Dan haal ik zo de gegevens op:

<?php
if (isset($match_zoeken)) {
if ($match_zoeken->num_rows > 0) {
$_SESSION['matched_words'] = array();
//echo (5 / $result3->num_rows) * 25;
echo "<center style='text-align: center;'>Er zijn " . $match_zoeken->num_rows . " vacatures gevonden.</center><br />";
while ($row3 = $match_zoeken->fetch_object())

{

//
echo "<tr style='border: 1px solid black;'>";
echo "<td>Werkervaring, Locatie, Functie<br /></td>";
//echo "<td valign='top'><br /><b>Functie omschrijving:</b><br /></td>";
echo "<td style='border: 1px solid black;'>".$row3->Locatie."<br /></td>";
echo "<td style='border: 1px solid black;'><a href='vacaturematch.php?id=$row3->id'>" . $row3->Naam_Functie . "</a><br /></td>";
echo "<td style='border: 1px solid black;'>" . $row3->id . "</td>";
echo "<td style='border: 1px solid black;'>" . $row3->total_matches . "</td>";
echo "<td style='border: 1px solid black;'>" . $row3->matched_words . "</td>";
$_SESSION['matched_words'][$row3->id] = $row3->matched_words;

echo "</tr>";
}
?>

Maar als ik alles leeg laat bijvoorbeeld, dan
krijg ik total_matches 1, een ontzichtbare woord bij matched_words.

Hoe kan dit in hemelsnaam?



[size=xsmall]Toevoeging op 19/12/2012 10:55:36:[/size]

laat maar heb t al
Misschien een idee om dan je oplossing te delen met anderen?
Ja hoor tuurlijk als mensen d'r wat aan hebben.
Misschien niet de ideale oplossing,
maar dit in de functie zetten: (helpt)

<?php
if ($een == "") { $een = "''"; }
if ($twee == "") { $twee = "''"; }
if ($drie == "") { $drie = "''"; }
if ($vier == "") { $vier = "''"; }
if ($vijf == "") { $vijf = "''"; }
?>
Als een zoekveld leeg is wil je dat niet meenemen in de query, en als ze allemaal leeg zijn voer je de query niet uit, ik zou het zo doen:
<?php
function match_combo($words) {
	$sql = "SELECT
				vid.id,
                v.Naam_Functie,
                Locatie,
                COUNT(*) AS total_matches,
                GROUP_CONCAT(vid.matched_word) AS matched_words
            FROM
				(
				";
	$count = 0;
	foreach($words as $field => $word) {
		$count++;
		$sql .= "SELECT
					id,
					'" . $word . "' AS matched_word
				FROM
					vacatures
				WHERE
					" . $field . " LIKE '%" . $word . "%'" . PHP_EOL;
		if ($count < count($words))
			$sql .= "UNION" . PHP_EOL;
	}
	$sql .= "				) AS vid
			INNER JOIN
				vacatures AS v
				ON
					vid.id = v.id
			GROUP BY vid.id
			ORDER BY total_matches DESC";
	return $mysqli->query($sql);
}
$things_to_match = array();
if (isset($_POST['match_functie']) && trim($_POST['match_functie']) != '')
	$things_to_match['Naam_Functie'] = $mysqli->real_escape_string($_POST['match_functie']);
//bovenstaande doe je hetzelfde voor alle posts
if (count($things_to_match) > 0) {
	$match_zoeken = match_combo($things_to_match);
	if ($match_zoeken !== false) {
		//dan jou laatste stukje code
	}
}
?>
Bedankt, ik kom er niet echt helemaal uit maar dit is wat er van gemaakt heb:
De functie:
<?php
function match_Combo_zoeken($words) {
global $match_zoeken;
include('includes/db-connectie-info.php');
$sql = "SELECT
vid.id,
v.Naam_Functie,
Locatie,
COUNT(*) AS total_matches,
GROUP_CONCAT(vid.matched_word) AS matched_words
FROM
(
";
$count = 0;
foreach($words as $field => $word) {
$count++;
$sql .= "SELECT
id,
'" . $word . "AS matched_word
FROM
vacatures
WHERE
" . $field . "LIKE %'" . $word . "'%" . PHP_EOL;
if ($count < count($words))
$sql .= "UNION" . PHP_EOL;
}
$sql .= " ) AS vid
INNER JOIN
vacatures AS v
ON
vid.id = v.id
GROUP BY vid.id
ORDER BY total_matches DESC";
$match_zoeken = $mysqli->query($sql);
return $match_zoeken;
}
?>

En dan de main script:
<?php
if (isset($_POST['match_zelf'])) {

$things_to_match = array();
if (isset($_POST['match_functie']) && trim($_POST['match_functie']) != '' ||
isset($_POST['match_locatie']) && trim($_POST['match_locatie']) != '' ||
isset($_POST['match_omschrijving']) && trim($_POST['match_omschrijving']) != '' ||
isset($_POST['match_eisen']) && trim($_POST['match_eisen']) != '' ||
isset($_POST['match_voorwaarden']) && trim($_POST['match_voorwaarden']) != '')
{
$things_to_match['Naam_Functie'] = $mysqli->real_escape_string($_POST['match_functie']);
$things_to_match['Locatie'] = $mysqli->real_escape_string($_POST['match_locatie']);
$things_to_match['Functie_Omschrijving'] = $mysqli->real_escape_string($_POST['match_omschrijving']);
$things_to_match['Werkervaring'] = $mysqli->real_escape_string($_POST['match_eisen']);
$things_to_match['Arbeidsvoorwaarden'] = $mysqli->real_escape_string($_POST['match_voorwaarden']);
if (count($things_to_match) > 0) {
$match_zoeken = match_Combo_zoeken($things_to_match);
if ($match_zoeken !== false) {
//dan jou laatste stukje code
if (isset($match_zoeken)) {
if ($match_zoeken->num_rows > 0) {
$_SESSION['matched_words'] = array();
//echo (5 / $result3->num_rows) * 25;
echo "<center style='text-align: center;'>Er zijn " . $match_zoeken->num_rows . " vacatures gevonden.</center><br />";
while ($row3 = $match_zoeken->fetch_object())

{

//
echo "<tr style='border: 1px solid black;'>";
echo "<td>Werkervaring, Locatie, Functie<br /></td>";
//echo "<td valign='top'><br /><b>Functie omschrijving:</b><br /></td>";
echo "<td style='border: 1px solid black;'>".$row3->Locatie."<br /></td>";
echo "<td style='border: 1px solid black;'><a href='vacaturematch.php?id=$row3->id'>" . $row3->Naam_Functie . "</a><br /></td>";
echo "<td style='border: 1px solid black;'>" . $row3->id . "</td>";
echo "<td style='border: 1px solid black;'>" . $row3->total_matches . "</td>";
echo "<td style='border: 1px solid black;'>" . $row3->matched_words . "</td>";
$_SESSION['matched_words'][$row3->id] = $row3->matched_words;

echo "</tr>";
}

}
// if there are no records in the database, display an alert message
else
{
echo "<tr>";
echo "<td><br />Geen match gevonden op basis van werkervaring33<br /></td>";
echo "</tr>";
}
}
}
}
}
}
?>

Ik krijg foutmelding:
<php
Warning: mysqli::query() [mysqli.query]: (42000/1064): 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 ''% UNION SELECT id, 'AS matched_word' at line 11 in
?>
Hier ben je een quote vergeten:

'" . $word . "AS matched_word


[size=xsmall]Toevoeging op 20/12/2012 11:04:23:[/size]

En hier zal je nog een spatie nodig hebben voor de LIKE (net als boven voor de AS:

" . $field . "LIKE %'" . $word . "'%" . PHP_EOL;


Overigens, bij dit soort foutmeldingen altijd als eerste je SQL eens echoen zoals het naar de database wordt gestuurd. Dan zal je dit soort fouten direct zien.
Bedankt reactie,

Dus dan wordt het zo: '" . $word . "' AS matched_word

Dan krijg ik opnieuw een warning:
Warning: mysqli::query() [mysqli.query]: (42000/1064): 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 'UNION SELECT id, '' AS matched_word ' at line 16

Kan die wel $word vinden?

Dus dan wordt het zo:
" . $field . " LIKE %'" . $word . "'%" . PHP_EOL;
Een warning:
Warning: mysqli::query() [mysqli.query]: (42000/1064): 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 '%'piping'% UNION SELECT id, '' AS ma' at line 15

Ga het even echoen, wat jij zei, kijken what happens
Erwin H op 20/12/2012 11:02:50

Overigens, bij dit soort foutmeldingen altijd als eerste je SQL eens echoen zoals het naar de database wordt gestuurd. Dan zal je dit soort fouten direct zien.


Ik wil het echoen: echo $match_zoeken; maar geen output
$match_zoeken is het RESULTAAT van je query. Ik zei je SQL echoen.
Oke dankje
Dan krijg ik dit:
SELECT vid.id, v.Naam_Functie, Locatie, COUNT(*) AS total_matches, GROUP_CONCAT(vid.matched_word) AS matched_words FROM ( SELECT id, 'piping' AS matched_word FROM vacatures WHERE Naam_Functie LIKE %'piping'% UNION SELECT id, '' AS matched_word FROM vacatures WHERE Locatie LIKE %''% UNION SELECT id, '' AS matched_word FROM vacatures WHERE Functie_Omschrijving LIKE %''% UNION SELECT id, '' AS matched_word FROM vacatures WHERE Werkervaring LIKE %''% UNION SELECT id, '' AS matched_word FROM vacatures WHERE Arbeidsvoorwaarden LIKE %''% ) AS vid INNER JOIN vacatures AS v ON vid.id = v.id GROUP BY vid.id ORDER BY total_matches DESC

Notitie: Ik heb alleen (zoals je ziet) naam_functie met waarde piping ingevuld en de rest leeg gelaten.

Reageren