PHP: Если результат MYSQL больше 0, добавить в массив?

#php #mysql

#php #mysql

Вопрос:

У меня есть таблица MYSQL со списком сервисов, которые предоставляет пользователь:

Значения Enum в этих столбцах могут быть 0 или 1. 0 представляет собой не предлагаемую услугу, а 1 представляет предлагаемую услугу.

 Cleaning   Tour Guide    Cooking    Parties
0          1             0          1
  

Затем я запускаю следующий запрос в MYSQL для извлечения моих строк в таблице:

  <?php $myBio = $conn->query("SELECT * FROM user_data, user_services WHERE user_data.user_id = user_services.user_id AND user_id = $p_id");
    if ($myBio->num_rows > 0) {
    $row = $myBio->fetch_assoc();?>
  

Я хочу сгенерировать список предоставляемых пользователем сервисов (где значение сервиса больше 0) — и разделить список запятыми, вот так:

 Tour Guide, Parties
  

Я пытаюсь сделать это с помощью массива:

 $os = array(if($row['cleaning'] > 0) { echo 'cleaning';}, if($row['tour'] >0) { echo 'Tour Guide'; });
  

Я пытаюсь использовать операторы PHP if, чтобы расшифровать, равен ли сервис 0 или 1, прежде чем добавлять его в мой список.

Я не верю, что возможно комбинировать операторы php if внутри массива.

Пожалуйста, может кто-нибудь показать мне, как я могу достичь желаемого результата? Заранее спасибо

Комментарии:

1. ПРЕДУПРЕЖДЕНИЕ : По возможности используйте подготовленные инструкции , чтобы избежать введения произвольных данных в ваши запросы и создания ошибок SQL-инъекций . Это довольно просто сделать в mysqli и PDO , где любые предоставленные пользователем данные указываются с помощью индикатора ? or :name , который позже заполняется с помощью bind_param or execute в зависимости от того, какой из них вы используете.

Ответ №1:

Использовать array_keys() с необязательным параметром поиска:

 $services = array_keys($row, 1);
  

Пример:

 $row = [
    'Cleaning'   => 0,
    'Tour Guide' => 1,
    'Cooking'    => 0,
    'Parties'    => 1,
];

$services = array_keys($row, 1);

var_export($services);
  

Результат:

 array (
  0 => 'Tour Guide',
  1 => 'Parties',
)
  

ДЕМОНСТРАЦИЯ

Ответ №2:

Если столбцы вашей базы данных имеют говорящее имя, вы можете сделать это следующим образом:

 <?php
    $arrayServices = array();
    $arrayAllServices = array('Cleaning','Tour Guide','Cooking','Parties');
    foreach($arrayAllServices as $service) {
        if($row[$service] > 0) {
            $arrayServices[] = $service;
        }
    }

    $sServices = join(', ', $arrayServices);

    echo $sServices;
  

Если говорящие имена отличаются от имен столбцов, вам нужен второй массив для поиска переводов.

Ответ №3:

Достигнет ли что-то подобное того, чего вы хотите?

 $results=array();
if ($row['cleaning']>0) $results[]='Cleaning';
if ($row['tour']>0) $results[]='Tour Guide';
// ...
  

Также, пожалуйста, обратите внимание на комментарий @tadman о подготовленных операторах!

Ответ №4:

 <?php 
    $myResults = array();
    $myBio = $conn->query("SELECT * FROM user_data, user_services WHERE user_data.user_id = ? AND user_id = ?");
    $stmt->bind_param("ss",$user_services.user_id,$p_id);
    $stmt->execute();
    $result = $stmt->get_result();
    if($result->num_rows === 0) exit('No rows');
    while($row = $result->fetch_assoc()) 
    {
        $tempArray = array();
        $Cleaning = $row['Cleaning'];
        $Tour_Guide = $row['TourGuide'];
        $Cooking = $row['Cooking'];
        $Parties = $row['Parties'];
        if($Cleaning == 1)
            array_push($tempArray,$Cleaning)
        if($Cleaning == 1)
            array_push($tempArray,$Cleaning)
        if($Cooking == 1)
            array_push($tempArray,$Cooking )
        if($Parties == 1)
            array_push($tempArray,$Parties )
        array_push($myResults,$tempArray);
    }
?>
  

Затем вы получите myResult массив, который будет представлять собой множество массивов, затем вы можете перебирать подмассивы для проверки значений и построения строк, которые вы собираетесь создать.