Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal, boa tarde.
Estou usando o Datatable server-side-processing, porém estou tentando fazer um inner join com 2 tabelas, más está dando erro nesta linha: $queryRecords = mysqli_query($conn, $sqlRec) or die("erro queryRecords");
Segue código abaixo. Agradeço a quem puder me ajudar. Abraço!
<?php
include_once("connection.php");
$params = $columns = $totalRecords = $data = array();
$params = $_REQUEST;
$columns = array(
0 =>'dia'.'id',
1 =>'dia'.'data_abertura',
2 =>'dia'.'data_liberacao',
3 =>'dia'.'data_montagem',
4 =>'dia'.'codiks',
5 =>'dia'.'planejador',
6 =>'dia'.'op'
);
$where = $sqlTot = $sqlRec = "";
if( !empty($params['search']['value']) ) {
$where .=" WHERE ";
$where .=" ( data_abertura LIKE '".$params['search']['value']."%' ";
$where .=" OR codiks LIKE '".$params['search']['value']."%' ";
$where .=" OR planejador LIKE '".$params['search']['value']."%' )";
}
$sql = "SELECT * FROM `dia` INNER JOIN `estf004` ON (`dia`.`codiks` = `estf004`.`codiks`) ";
$sqlTot .= $sql;
$sqlRec .= $sql;
if(isset($where) && $where != '') {
$sqlTot .= $where;
$sqlRec .= $where;
}
$sqlRec .= " ORDER BY ". $columns[$params['order'][0]['column']]." ".$params['order'][0]['dir']." LIMIT ".$params['start']." ,".$params['length']." ";
$queryTot = mysqli_query($conn, $sqlTot) or die("database error:". mysqli_error($conn));
$totalRecords = mysqli_num_rows($queryTot);
$queryRecords = mysqli_query($conn, $sqlRec) or die("erro queryRecords");
while( $row = mysqli_fetch_row($queryRecords) ) {
$data[] = $row;
}
$json_data = array(
"draw" => intval( $params['draw'] ),
"recordsTotal" => intval( $totalRecords ),
"recordsFiltered" => intval($totalRecords),
"data" => $data
);
echo json_encode($json_data);
?>Obrigado por responder.
Esse problema, após muito fuçar, consegui acertar o inner join.
Meu problema agora é outro.
------------------------------------------------------------------------------------
Preciso tirar a diferença entre duas datas (data_abertura e data_liberação), para exibir em uma coluna do Datatable. Porém está dando esse erro:
Notice: Undefined index: date_difference in /var/www/producao/response.php on line 70
No banco, existem linhas onde a data_liberação não possui data, no caso 0000-00-00, e imagino que possa ser esse o motivo desse erro.
Mais uma vez agradeço a quem ajudar.
Segue o código abaixo:
<?php
include_once("connection.php");
$params = $columns = $totalRecords = $data = array();
$params = $_REQUEST;
$columns = array(
0 =>'`u`.`id`',
1 =>'`u`.`data_abertura`',
2 =>'`u`.`data_liberacao`',
3 =>'`u`.`data_montagem`',
4 =>'`u`.`codiks`',
5 => '`u`.`planejador`',
);
$where = $sqlTot = $sqlRec = "";
// check search value exist
if( !empty($params['search']['value']) ) {
$where .=" WHERE ";
$where .=" ( u.data_abertura LIKE '".$params['search']['value']."%' )";
$where .=" OR u.data_liberacao LIKE '".$params['search']['value']."%' ";
$where .=" OR u.data_montagem LIKE '".$params['search']['value']."%' ";
$where .=" OR u.codiks LIKE '".$params['search']['value']."%' ";
$where .=" OR u.planejador LIKE '".$params['search']['value']."%' ";
}
$sql = "SELECT *, DATEDIFF(data_abertura, data_liberacao) AS date_difference FROM `dia` AS `u` INNER JOIN `estf004` AS `ud` ON (`ud`.`codiks` = `u`.`codiks`)";
$sqlTot .= $sql;
$sqlRec .= $sql;
if(isset($where) && $where != '') {
$sqlTot .= $where;
$sqlRec .= $where;
}
$sqlRec .= " ORDER BY ". $columns[$params['order'][0]['column']]." ".$params['order'][0]['dir']." LIMIT ".$params['start']." ,".$params['length']." ";
$queryTot = mysqli_query($conn, $sqlTot) or die("database error:". mysqli_error($conn));
$totalRecords = mysqli_num_rows($queryTot);
$queryRecords = mysqli_query($conn, $sqlRec);
while( $row = mysqli_fetch_row($queryRecords) ) {
$result1 = $row[0];
$result2 = $row[1];
$result3 = $row[2];
$result4 = $row[3];
$result5 = $row[4];
$result6 = $row[5];
/*************************ESSA É A LINHA DO ERRO******************************************/
$result7 = $row['date_difference']; //Esta é a linha do erro (linha 70)
/********************************************************************************************/
}
$data[] = array($result1, $result2, $result3, $result4, $result5, $result6, $result7);
$json_data = array(
"draw" => intval( $params['draw'] ),
"recordsTotal" => intval( $totalRecords ),
"recordsFiltered" => intval($totalRecords),
"data" => $data
);
echo json_encode($json_data);
?>Do manual: http://php.net/manual/en/mysqli-result.fetch-row.php
mysqli_result::fetch_row -- mysqli_fetch_row — Get a result row as an enumerated array
O que você possui na linha 70 é um array associativo e o que a função retorna é um array indexado. Logo, a key abaixo não existe:
$result7 = $row['date_difference'];
Substitua a função mysqli_fetch_row por mysqli_fetch_array
Gabriel, era isso mesmo. Alterei a linha como você falou e funcionou. Muito Obrigado.
Tô quase finalizando, más só estou com um problema.
Não estou conseguindo fazer com que o Datatable faça busca na coluna onde está o date_difference.
Simplesmente não mostra nada quando tento buscar algo que tenha nesta coluna.
Imagino que o problema esteja na linha que está identificada abaixo no script, no qual não consigo acertar.
Abraço!
<?php
include_once("connection.php");
$params = $columns = $totalRecords = $data = array();
$params = $_REQUEST;
$columns = array(
0 =>'`u`.`id`',
1 =>'`u`.`data_abertura`',
2 =>'`u`.`data_liberacao`',
3 =>'`u`.`data_montagem`',
4 =>'`u`.`codiks`',
5 => '`u`.`planejador`',
);
$where = $sqlTot = $sqlRec = "";
if( !empty($params['search']['value']) ) {
$where .=" WHERE ";
$where .=" ( u.data_abertura LIKE '".$params['search']['value']."%' )";
$where .=" OR u.data_liberacao LIKE '".$params['search']['value']."%' ";
$where .=" OR u.data_montagem LIKE '".$params['search']['value']."%' ";
$where .=" OR u.codiks LIKE '".$params['search']['value']."%' ";
$where .=" OR u.planejador LIKE '".$params['search']['value']."%' ";
/*********** acho que o problema é aqui, más não sei como resolver **************/
$where .=" OR 'date_difference' LIKE '".$params['search']['value']."%' ";
}
$sql = "SELECT *, DATEDIFF(data_liberacao, data_abertura) AS date_difference FROM `dia` AS `u` INNER JOIN `estf004` AS `ud` ON (`ud`.`codiks` = `u`.`codiks`)";
$sqlTot .= $sql;
$sqlRec .= $sql;
if(isset($where) && $where != '') {
$sqlTot .= $where;
$sqlRec .= $where;
}
$sqlRec .= " ORDER BY ". $columns[$params['order'][0]['column']]." ".$params['order'][0]['dir']." LIMIT ".$params['start']." ,".$params['length']." ";
$queryTot = mysqli_query($conn, $sqlTot) or die("database error:". mysqli_error($conn));
$totalRecords = mysqli_num_rows($queryTot);
$queryRecords = mysqli_query($conn, $sqlRec) or die("error to fetch employees data");
while( $row = mysqli_fetch_array($queryRecords) ) {
$result1 = $row[0];
$result2 = $row[1];
$result3 = $row[2];
$result4 = $row[3];
$result5 = $row[4];
$result6 = $row[5];
$result7 = $row['date_difference'];
$data[] = array($result1, $result2, $result3, $result4, $result5, $result6, $result7);
}
$json_data = array(
"draw" => intval( $params['draw'] ),
"recordsTotal" => intval( $totalRecords ),
"recordsFiltered" => intval($totalRecords),
"data" => $data // total data array
);
echo json_encode($json_data); // send data as json format
?>Provavelmente deve adicionar a nova coluna na variável $columns e na própria consulta SQL.
Então, coloquei, más não sei se de maneira correta.
Eu coloquei na variável $columns na posição 6.
E também na última linha do $where, só que não vai.
Puts que se eu resolver esse lance da busca nesta coluna, resolvo 100% dos problemas. rs.
Valeu Abraço!
$columns = array(
0 =>'u.id',
1 =>'u.data_abertura',
2 =>'u.data_liberacao',
3 =>'u.data_montagem',
4 =>'u.codiks',
5 => 'u.planejador',
6 => 'u.date_difference',
);
$where = $sqlTot = $sqlRec = "";
if( !empty($params['search']['value']) ) {
$where .=" WHERE ";
$where .=" ( u.data_abertura LIKE '".$params['search']['value']."%' )";
$where .=" OR u.data_liberacao LIKE '".$params['search']['value']."%' ";
$where .=" OR u.data_montagem LIKE '".$params['search']['value']."%' ";
$where .=" OR u.codiks LIKE '".$params['search']['value']."%' ";
$where .=" OR u.planejador LIKE '".$params['search']['value']."%' ";
$where .=" OR u.date_difference LIKE '".$params['search']['value']."%' ";
}
$sql = "SELECT *, DATEDIFF(data_liberacao, data_abertura) AS date_difference FROM `dia` AS `u` INNER JOIN `estf004` AS `ud` ON (`ud`.`codiks` = `u`.`codiks`)";O problema está na seu WHERE. Você adicionou u.date_difference.
Por partes:
Logo, a referência está errada. Você deve colocar a mesma função no where:
"SELECT
DATEDIFF(start , end)
FROM
table
WHERE
DATEDIFF(start , end) = 'clausula'";
ou em um subselect:
"SELECT * FROM (
SELECT
DATEDIFF(start , end) as datediff
FROM
table
) as result
WHERE
result.datediff = 'clausula'";
Vai depender do que tu achar mais "conveniente"
Bom dia.
Mais uma vez agradeço pelas dicas.
Vou tentar implementar isso, e retorno pra dizer o resultado.
Abraço!
Bom dia.
Eu entendi que na clausula where, também tem que ter esta função, porém tentei de várias formas na váriavel $columns colocar o nome diff criado na clausula where.
Coloquei um com 'u', sem u, de toda maneira possível, más sem sucesso.
Ainda não consegui resolver isso.
Quem puder contribuir, agradeço a força. Ainda sou novato em programação php com javascript. rs
Abraço a todos.
$columns = array(
0 =>'u.id',
1 =>'u.data_abertura',
2 =>'u.data_liberacao',
3 =>'u.data_montagem',
4 =>'u.codiks',
5 => 'u.planejador',
6 => 'u.diff',
);
$where = $sqlTot = $sqlRec = "";
if( !empty($params['search']['value']) ) {
$where .=" WHERE ";
$where .=" ( u.data_abertura LIKE '".$params['search']['value']."%' )";
$where .=" OR u.data_liberacao LIKE '".$params['search']['value']."%' ";
$where .=" OR u.data_montagem LIKE '".$params['search']['value']."%' ";
$where .=" OR u.codiks LIKE '".$params['search']['value']."%' ";
$where .=" OR u.planejador LIKE '".$params['search']['value']."%' ";
$where .=" OR DATEDIFF(data_liberacao, data_abertura) = 'diff' LIKE '".$params['search']['value']."%' ";
}
$sql = "SELECT *, DATEDIFF(data_liberacao, data_abertura) AS date_difference FROM `dia` AS `u` INNER JOIN `estf004` AS `ud` ON (`ud`.`codiks` = `u`.`codiks`)";O u não pode ter. Ele é um apelido de uma tabela, a função não é uma coluna de uma tabela.
Aqui:
$where .=" OR DATEDIFF(data_liberacao, data_abertura) = 'diff' LIKE '".$params['search']['value']."%' ";
Você possui um = 'diff' e logo depois um LIKE. Você deve usar igual ou LIKE, não ambos.
Nossa, matou a pau.
Era só tirar o diff e colocar o DATEDIFF na posição 6 que deu certo.
Muito obrigado pela ajuda.
Abraço!
6 => 'DATEDIFF',
$where .=" OR DATEDIFF(data_liberacao, data_abertura) LIKE '".$params['search']['value']."%' ";
Olá, Empirerock.
Você poderia compartilhar os arquivos js e html que você usou?
Desde já, muito obrigado.
Sds,
DataTable é uma biblioteca client-side que utiliza recursos server-side. A consulta continua tendo limítrofes de uma consulta SQL em um SGBD MySQL.
Vai ficar mais fácil te ajudar se informar qual é o erro.