Вопрос и следующее: у меня есть небольшой код, который проверяет, существует ли определенный тег в поле таблицы, который я пытался сделать следующим образом:
<?php
$value = "e-sports";
$test = array();
$take = mysqli_query($conexao,"SELECT * FROM news WHERE game LIKE '%$value%' OR tags LIKE '%$value%' ");
while ($info = mysqli_fetch_array($take)) {
$test[] = $info['tags'];
if (in_array($value, $test)) {
echo "ok";
}else{
echo "not";
}
}
?>
но это не сработало. Я хотел бы знать, имеет ли он лучшую форму или что-то использовать.
Похоже, столбец tags
вашей базы данных - это какой-то список, содержащий несколько тегов, например 'tag1,tag2,tag3'
, поэтому ваше решение и решение Rod Elias не будут работать, просто проводя сравнение строк.
Вместо этого вы должны взорвать строку в массив и затем выполнить поиск. Задайте значение $tagseparator
как разделитель тегов в db.
<?php
$value = "e-sports";
$tagseparator = ",";
$test = array();
$take = mysqli_query($conexao,"SELECT * FROM news WHERE game LIKE '%$value%' OR tags LIKE '%$value%' ");
while ($info = mysqli_fetch_array($take)) {
foreach(explode($tagseparator,$info['tags']) as $tag) {
$test[] = $tag;
}
}
if (in_array($value, $test)) {
echo "ok";
} else {
echo "not";
}
?>
Обратите внимание, что если вы хотите проверить строку за строкой, а не во всем наборе результатов, вы просто измените тест на
while ($info = mysqli_fetch_array($take)) {
$test = explode($tagseparator,$info['tags']);
if (in_array($value, $test)) {
echo "ok";
} else {
echo "not";
}
}
Почему бы вам просто не сделать:
if ($info['tags'] == $value) {
echo 'ok';
} else {
echo 'not';
}
?
У меня есть решение без использования цикла while
$value = "e-sports";
$test = array();
$take = mysqli_query($conexao,"SELECT * FROM news WHERE game LIKE '%$value%' OR tags LIKE '%$value%' ");
//$take = [['id'=> 1, "tags" => "e-sports", "game" => "lol"],
//['id'=> 2, "tags" => "mobile", "game" => "lol"],
//['id'=> 3, "tags" => "xbox", "game" => "abc"]];
$filter = array_filter( $take , function($v, $k) use ($value){
return $v["tags"] == $value;
} , ARRAY_FILTER_USE_BOTH);
if(sizeof($filter) > 0){
echo 'yes';
}else{
echo 'not';
}
fetch_all()
до вызова функции фильтра, которую вы еще не fetch_all()
. Кроме того, array_filter()
фактически является циклом for, поэтому вы не добьетесь экономии вычислительных array_filter()
, в то же время значительно array_filter()
стоимость дополнительной памяти.