PHP-запрос, возвращающий только одну строку из четырех - PullRequest
0 голосов
/ 11 января 2019

Этот запрос должен был вернуть мне четыре строки: четыре человека со статусом 50 (что в приложении означает «декретный отпуск»). Но он возвращает только один.

В HeidiSQL запрос даже не запускается, потому что он отображает

синтаксическая ошибка в строке 13:

(...)

соответствует вашей версии сервера MariaDB для правильного синтаксиса для использования рядом с 'a.id_regiao =' $ id_regiao ' AND a.cod_status = 50 И a.status 'в строке 13 * / "

Вот запрос. Я постепенно знакомлюсь с SQL-операторами, и я много раз искал по SO, прежде чем спрашивать:

//SELECTING PROJECT DATA
$query = "SELECT b.id_clt,b.nome AS nome_clt,
        a.id_evento AS a_id_evento,a.data AS a_data,a.data_retorno AS a_data_retorno,
        c.id_evento AS c_id_evento,c.data AS c_data,c.data_retorno AS c_data_retorno,
        (SELECT nome FROM projeto WHERE id_projeto = a.id_projeto) AS nome_projeto,
        (SELECT nome FROM curso WHERE id_curso = b.id_curso) AS nome_curso,
        DATE_FORMAT(a.data,'%d/%m/%Y') AS a_data_br,
        DATE_FORMAT(a.data_retorno,'%d/%m/%Y') AS a_data_retorno_br,
        DATE_FORMAT(c.data,'%d/%m/%Y') AS c_data_br,
        DATE_FORMAT(c.data_retorno,'%d/%m/%Y') AS c_data_retorno_br
        FROM rh_eventos AS a
        INNER JOIN rh_clt AS b ON (a.id_clt = b.id_clt AND a.cod_status = 50)
        LEFT JOIN rh_eventos AS c ON (b.id_clt = c.id_clt AND c.cod_status = 54)
        WHERE $cond_projeto a.id_regiao = '$id_regiao' 
        AND a.cod_status = 50
        AND a.status = 1 
        AND NOW() BETWEEN a.data AND a.data_retorno 
        ORDER BY nome_projeto,b.nome;";

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Вот запрос (как видно по эхо перед ним). Теперь я вижу вывод на heidsql. Теперь нам лучше это проверить:

SELECT b.id_clt,b.nome AS nome_clt, 
a.id_evento AS a_id_evento,a.data AS a_data,a.data_retorno AS a_data_retorno,
 c.id_evento AS c_id_evento,c.data AS c_data,c.data_retorno AS c_data_retorno,
  (SELECT nome FROM projeto WHERE id_projeto = a.id_projeto) AS nome_projeto, 
  (SELECT nome FROM curso WHERE id_curso = b.id_curso) AS nome_curso, 
  DATE_FORMAT(a.data,'%d/%m/%Y') AS a_data_br, 
  DATE_FORMAT(a.data_retorno,'%d/%m/%Y') AS a_data_retorno_br,
   DATE_FORMAT(c.data,'%d/%m/%Y') AS c_data_br, 
    DATE_FORMAT(c.data_retorno,'%d/%m/%Y') AS c_data_retorno_br 
    FROM rh_eventos AS a 
    INNER JOIN rh_clt AS b ON (a.id_clt = b.id_clt AND a.cod_status = 50) 
    LEFT JOIN rh_eventos AS c ON (b.id_clt = c.id_clt AND c.cod_status = 54) 
    WHERE a.id_regiao = '1' AND a.cod_status = 50
    AND a.status = 1 
    AND NOW() BETWEEN a.data AND a.data_retorno ORDER BY nome_projeto,b.nome;

Теперь я вижу вывод на heidsql, хотя до сих пор не могу понять, почему он выводит остальные строки.

0 голосов
/ 11 января 2019

Проблема здесь в запросе:

    WHERE $cond_projeto a.id_regiao = '$id_regiao' 

Это вставляет переменную (или, может быть, полный тест?) Без правильного синтаксиса. Если это переменная, включите имя столбца таблицы в критерий. Если это полный тест, включите И вот так:

    WHERE $cond_projeto AND a.id_regiao = '$id_regiao' 

Осторожно, хотя! Используйте подготовленные операторы, теперь ваш код кажется уязвимым для атак с использованием SQL-инъекций (и с ними нельзя шутить).

...