Да ми показва думите които не съществуват в таблицата

dunix

Registered
Здравейте,
Имам таблица с интереси. Имам и форма с която търся дадени интереси.
Искам да направя така, че ако съм въвел интерес, които не съществува в таблицата да ми го показва най-горе и да ми покаже, че липсва, а отдолу да покаже тези, които съществиват и отговарят на критериите в търсачката

PHP:
$intArr = explode(',', $arrayInteresiInput);

$like = '';
foreach($intArr as $key => $element) {
	if($key !=0 )
		$like .= ' OR ';
	$trimmed = ltrim($element);
	$like .= ' `titleName` LIKE \'%'.$trimmed.'%\' ';
}

$result = $db->query("SELECT * FROM `interesi` WHERE {$like}");


if ($result->num_rows > 0) { 
	while ($row = $result->fetch_array()) {
		$storeArray[] =  $row;  
	}
	foreach ($storeArray as $value) {
		$id = $value['id'];
		$title= $value['titleName'];
		echo "$id $title<br />\n";
	}
} else {
		echo "No result";
}
Темата е продължение на тази тема.
 
Ако те разбрах правилно, кода по-долу трбява да прави това, което искаш.
Трябва да работи нормално, когато са:
- въведени интереси, които не съществуват в DB;
- въведени интереси, които всички съществуват в DB;
- въведени интереси, някои, от които съществуват в DB.

Код:
$intArr = explode(',', $arrayInteresiInput);

//http://php.net/manual/en/function.trim.php
//http://php.net/manual/en/function.array-map.php

$intArr = array_map('trim', $intArr);

$like = '';

foreach ($intArr as $key => $element) {
    if ($key != 0)
        $like .= ' OR ';

    // Това го махаме, тъй като по-горе ще trim-нем всички values на array-a.
    //$trimmed = ltrim($element);
    $like .= ' `titleName` LIKE \'%' . $trimmed . '%\' ';
}

$result = $db->query("SELECT * FROM `interesi` WHERE {$like}");


//Тук ще държим намерените интереси:
$foundInt = [];
if ($result->num_rows > 0) {
    while ($row = $result->fetch_array()) {
        $foundInt[$value['id']] = $value['titleName'];
    }
}
//Ако няма резултати, значи всички елементи от масива $intArr се показват:
// else частта не ни трябва.
//else {
//
//    echo "No result";
//}

echo 'Found in db: <hr />';
foreach($foundInt as $id => $titleName) {
    echo 'ID: '.$id .' Title: '.$titleName.'<br />';
}

echo '<br /> Not found in db: <hr />';
$notFound = array_diff($foundInt, $intArr);
foreach($notFound as $title) {
    echo 'Title: '. $title.'<br />';
}
 
@Fakeheal не ми показва ненамерените резултати

99a5208519.png


Освен това

PHP:
 $foundInt[$value['id']] = $value['titleName'];
трябва да е
PHP:
 $foundInt[$row['id']] = $row['titleName'];
и
PHP:
$like .= ' `titleName` LIKE \'%' . $trimmed . '%\' ';
трябва да е
PHP:
$like .= ' `titleName` LIKE \'%' . $element. '%\' ';

Редакция:

Като прочетох в php какво представлява функцията array_diff разбрах, че просто си объркала (до колкото знам си жена, извини ме ако греша!) местата.
размених
PHP:
$notFound = array_diff($foundInt, $intArr);
с

PHP:
$notFound = array_diff($intArr, $foundInt);
но имам сега друг проблем:

99d35d2359.png


Също така искам да попитам как да достигна поле като iDesc да ми го показва до името.
 
Дам, тъй като like не е exact match или ще трябва да измислиш друг начин за търсене в DB или да ги матчваш с равно =


Вариант има и като правиш select за всеки един елемент от масива $intArray, но е доста лош approach.

Може да се ориентираш към някакъв autocomplete плъгин за тагове. Тъй като интересите ти могат да бъдат все едно тагове. Повечето такива плъгини имат api, което да ти покаже кое е било autocomplete-нато (т.е. го е имало в DB-то ти) и кои идват от raw input (user-a ги е написал).
 
Fakeheal, ще може ли да ми отговориш на последния въпрос, който ме интересува повече.

dunix каза:
Също така искам да попитам как да достигна поле като iDesc да ми го показва до името.
 
dunix каза:
Fakeheal, ще може ли да ми отговориш на последния въпрос, който ме интересува повече.

dunix каза:
Също така искам да попитам как да достигна поле като iDesc да ми го показва до името.

Това колона от DB ли ти е?
 
Променяш този ред:
Код:
 $foundInt[$row['id']] = $row['titleName'];

на:
Код:
 $foundInt[$row['id']] = ['title' => $row['titleName'], 'description' => $row['iDesc']];

После променяш:
Код:
$notFound = array_diff($intArr, $foundInt);

На:
Код:
$notFound = array_diff($intArr, array_column($foundInt, 'title'));
http://php.net/manual/en/function.array-column.php

И накрая:
Код:
foreach($foundInt as $id => $titleName) { 
    echo 'ID: '.$id .' Title: '.$titleName.'<br />'; 
}

На:
Код:
foreach($foundInt as $id => $interest) { 
    echo 'ID: '.$id .' Title: '.$interest['title'].'  Description: '.$interest['description'].' <br />'; 
}
 

Back
Горе