- Home
- Categorie
- Coding e Sistemistica
- PHP
- Query vuota o con errore
-
... che questo codice l'ha scritto un collega andato via, e (ho postato l'originale)
mi è stato chiesto di fare una vista dipendenti e non amministratore, allora ho modificato il codice pensando di far vedere a ogni utente solo il proprio dato (pensando che ci vuole filtro per ID e il gioco è fatto!),
l'originale funziona ma fa vedere e modificare tutti gli utenti e ovviamente invece ognuno deve vedere solo il suo dato...ecco il mio modificato, non mi pare di aver fatto casini... ma sicuramente da qualche parte ho toppato...
<?php
include('functions/funzioni.php');
if (isset($_SESSION['id_dip']));
$id_dip=$_SESSION['id_dip'];
$conn = apri_connessione();
$query = "SELECT dipendenti.id_dip, dipendenti.id_liv, dipendenti.matricola, dipendenti.cognome, dipendenti.nome,
dipendenti.ore_ordinarie, presenze.stato_presenza, presenze.ore_assenza, presenze.ore_presenza,presenze.con_ticket
FROM dipendenti LEFT JOIN presenze ON (dipendenti.id_dip = presenze.id_dip
AND presenze.giorno = $giorno
AND presenze.mese = $mese
AND presenze.anno = $anno)";
$query = $query . " WHERE dipendenti.id_dip = $id_dip AND ((UNIX_TIMESTAMP('$anno-$mese-$giorno') - ";
$query = $query . " UNIX_TIMESTAMP( dipendenti.data_fine_rapp
)) <=0)";
$query = $query . " OR (UNIX_TIMESTAMP( dipendenti.data_fine_rapp
) =0)";
//$query = $query . " order by dipendenti.matricola";//Aggiungo il pulsante per il default....
$arg = $HTTP_SERVER_VARS['REQUEST_URI'];
$str = "";//Spaziatura
$str = $str . " <tr>\n </tr>\n";
$str = $str . " <tr>\n </tr>\n";
$str = $str . " <tr>\n </tr>\n";//Apertura della riga nella quale è contenuta
//la tabella per il form d'inserimento
$str = $str . " <tr>\n";//Apertura del form per l'inserimento delle presenze
$str = $str . " <form name='inserisci_presenze' method='post' action='ins_pres_exec.php'>\n";//Apre la tabella
$str = $str . " <table border='0' bgcolor='#ffffff' width='630px'>\n";//Intestazione della tabella
$str = $str . " <tr>\n";
$str = $str . " <td width='10px' bgcolor='#ffffff' class='testa'>Maticola</td>\n";
$str = $str . " <td class='testa'>Cognome</td>\n";
$str = $str . " <td class='testa'>Nome</td>\n";
$str = $str . " <td width='10px' class='testa'>Ore Ordinarie</td>\n";
$str = $str . " <td width='10px' class='testa'>Stato</td>\n";
$str = $str . " <td width='40px' class='testa'>Ore di presenza</td>\n";
$str = $str . " <td width='40px' class='testa'>Ore di Assenza o Straordinario</td>\n";
$str = $str . " <td width='40px' class='testa'>Con Ticket</td>\n";
$str = $str . " </tr>\n";
//Dati della tabella (lista dei dipendenti)
//echo $query;
while ($linea = fetch_array($risultato, MYSQL_ASSOC))
{
//Riga dei dati
$id_dip = $linea["id_dip"];$stato_presenza = $linea['stato_presenza']; if($stato_presenza=='') $stato_presenza = 'NOT_SET'; $stato_presenza_reale = $linea['stato_presenza']; if($stato_presenza_reale=='') $stato_presenza_reale = 'NOT_SET'; if($stato_presenza=='NOT_SET') $str = $str . " <tr class='corpo_non_set'>\n"; else $str = $str . " <tr class='corpo'>\n";
//scorro l'array $linea per salvare il valore del campo
$str = $str . " <td>" . $linea['matricola'] . "</td>\n";
$str = $str . " <td>" . $linea['cognome'] . "</td>\n";
$str = $str . " <td>" . $linea['nome'] . "</td>\n";
$str = $str . " <td>" . $linea['ore_ordinarie'] . "</td>\n";if(($_GET['stato_default']!='') && ($stato_presenza=='NOT_SET')) $stato_presenza = $_GET['stato_default'];
//Disegno l'input box per lo stato e per le ore di assenza
$str = $str . "<td>".html_optionbox_presenze('stato',$id_dip,
$stato_presenza,$linea['ore_ordinarie'])."</td>";
//Campo ore presenza
$str = $str . " <td>\n";
$str = $str . " <input type='text' name='presenza" . $id_dip . "' id='testo" . $id_dip . "' ";
$str = $str . "value='" . ore_pres_dip($stato_presenza,$linea['ore_presenza'],$linea['ore_ordinarie']) . "' size='10'></input>\n";
$str = $str . " </td>\n";//Campo ore assenza
$disabilitato = "";
if($stato_presenza=='PRESENTE')
$disabilitato = 'disabled';$str = $str . " <td>\n";
$str = $str . " <input $disabilitato type='text' name='assenza" . $id_dip . "' id='aaaa" . $id_dip . "' ";
$str = $str . "value='" . ore_ass_dip($linea['ore_assenza']) . "' size='10'></input>\n";
$str = $str . " </td>\n";//Fine riga dei dati
//Campo verifica ticket
if($stato_presenza_reale=='NOT_SET')
$con_ticket = 'checked';
else
{
if($linea['con_ticket']=='1') $con_ticket = 'checked';
else $con_ticket = '';
}$str = $str . " <td>\n";
$str = $str . " <input type='checkbox' name='conticket" . $id_dip . "' id='conticket" . $id_dip . "' ";
$str = $str . "value='1' $con_ticket/>\n";
$str = $str . " </td>\n";
$str = $str . " </tr>\n";
}//Spaziatura
$str = $str . " <tr>\n </tr>\n";
$str = $str . " <tr>\n </tr>\n";
$str = $str . " <tr>\n </tr>\n";//Bottone submit
$str = $str . " <tr>\n";
$str = $str . " <td><input type='submit' name='Esegui' value='Applica'></td>\n";
$str = $str . " </tr>\n";//Chiusura della tabella
$str = $str . " </table>\n";//Passo come parametro anche la data
$str = $str . "<input type='hidden' name='gg' value='" . $giorno . "'>";
$str = $str . "<input type='hidden' name='mm' value='" . $mese . "'>";
$str = $str . "<input type='hidden' name='aaaa' value='" . $anno . "'>";
//Chiusura del form
$str = $str . " </form>\n";//Chiusura della riga nella quale è contenuta
//la tabella per il form d'inserimento
$str = $str . " </tr>\n";
$str = $str . " </table>\n";
$str = $str . "</tr>\n";
$str = $str . "</table>";
//echo "Ciao " . $_SESSION['id_dip'] ;
chiudi_recordset($risultato);
chiudi_connessione($conn);echo $str;
echo $query
?>
-
Allora:
partendo dal codice del tuo collega prova a sostituire il pezzo:
[php]//Query
//$query = "Select id_dip, matricola,cognome, nome,ore_ordinarie from dipendenti order by matricola";
$query = "SELECT dipendenti.id_dip, dipendenti.matricola, dipendenti.cognome, dipendenti.nome,
dipendenti.ore_ordinarie, presenze.stato_presenza, presenze.ore_assenza, presenze.ore_presenza,presenze.con_ticket
FROM dipendenti LEFT JOIN presenze ON ( dipendenti.id_dip = presenze.id_dip
AND presenze.giorno = $giorno
AND presenze.mese = $mese
AND presenze.anno = $anno)";
$query = $query . " WHERE ((UNIX_TIMESTAMP('$anno-$mese-$giorno') - ";
$query = $query . " UNIX_TIMESTAMP( dipendenti.data_fine_rapp
)) <=0)";
$query = $query . " OR (UNIX_TIMESTAMP( dipendenti.data_fine_rapp
) =0)";
$query = $query . " order by dipendenti.matricola";
[/php]con:[php]
if (isset($_SESSION['id_dip'])){
$id_dip=$_SESSION['id_dip'];
$query = "SELECT dipendenti.id_dip, dipendenti.id_liv, dipendenti.matricola, dipendenti.cognome, dipendenti.nome,
dipendenti.ore_ordinarie, presenze.stato_presenza, presenze.ore_assenza, presenze.ore_presenza,presenze.con_ticket
FROM dipendenti LEFT JOIN presenze ON (dipendenti.id_dip = presenze.id_dip
AND presenze.giorno = $giorno
AND presenze.mese = $mese
AND presenze.anno = $anno)";
$query = $query . " WHERE dipendenti.id_dip = $id_dip AND ((UNIX_TIMESTAMP('$anno-$mese-$giorno') - ";
$query = $query . " UNIX_TIMESTAMP( dipendenti.data_fine_rapp
)) <=0)";
$query = $query . " OR (UNIX_TIMESTAMP( dipendenti.data_fine_rapp
) =0)";
//$query = $query . " order by dipendenti.matricola";
}else{
$query = "SELECT dipendenti.id_dip, dipendenti.matricola, dipendenti.cognome, dipendenti.nome,
dipendenti.ore_ordinarie, presenze.stato_presenza, presenze.ore_assenza, presenze.ore_presenza,presenze.con_ticket
FROM dipendenti LEFT JOIN presenze ON ( dipendenti.id_dip = presenze.id_dip
AND presenze.giorno = $giorno
AND presenze.mese = $mese
AND presenze.anno = $anno)";
$query = $query . " WHERE ((UNIX_TIMESTAMP('$anno-$mese-$giorno') - ";
$query = $query . " UNIX_TIMESTAMP( dipendenti.data_fine_rapp
)) <=0)";
$query = $query . " OR (UNIX_TIMESTAMP( dipendenti.data_fine_rapp
) =0)";
$query = $query . " order by dipendenti.matricola";
}[/php]
in questo modo se nella sessione c'è id_dip il codice cerca nel db solo i dati relativi a quel dipendente, che era la tua idea originaria...Spero di esserti stato utile.
-
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\Programmi\easyphp\www\gestione_dipendenti\functions\db_functions.php on line 33
Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in C:\Programmi\easyphp\www\gestione_dipendenti\functions\db_functions.php on line 63
mi ridà il solito errore poi fa vedere l'intestazione della tabella ma non il dato e la query passa id_dip:
SELECT dipendenti.id_dip, dipendenti.id_liv, dipendenti.matricola, dipendenti.cognome, dipendenti.nome, dipendenti.ore_ordinarie, presenze.stato_presenza, presenze.ore_assenza, presenze.ore_presenza, presenze.con_ticket FROM dipendenti LEFT JOIN presenze ON (dipendenti.id_dip = presenze.id_dip AND presenze.giorno = 19 AND presenze.mese = 5 AND presenze.anno = 2008) WHERE dipendenti.id_dip = 4 AND ((UNIX_TIMESTAMP('2008-5-19') - UNIX_TIMESTAMP( dipendenti.
data_fine_rapp
)) <=0) OR (UNIX_TIMESTAMP( dipendenti.data_fine_rapp
) =0)db_functions.php
[php]
<?php
/* Liberazione delle risorse del risultato */
function apri_connessione()
{
global $db_host;
global $db_user;
global $db_password;
global $db_name;/* Connessione e selezione del database */
$connessione = mysql_connect($db_host,$db_user,$db_password)
or die("Connessione non riuscita ". $db_host.$db_user.$db_password);mysql_select_db($db_name)
or die("Selezione del database non riuscita ". $db_name);return $connessione;
}
/* Chiusura della connessione /
function chiudi_connessione($connessione)
{
return mysql_close($connessione);
}
function lista_tabelle($connessione,$database)
{
return mysql_list_tables($database);
}
function fetch_array($risultato)
{
return mysql_fetch_array($risultato);
}
function num_fields($risultato)
{
return mysql_num_fields($risultato);
}
function field_name ($risultato, $i)
{
return mysql_field_name ($risultato, $i);
}
function field_type($risultato, $i)
{
return mysql_field_type($risultato, $i);
}
function crea_recordset($query)
{
/ Esecuzione di una query SQL /
$risultato = mysql_query($query)
or die("Query fallita ".$query);
return $risultato;
}
/ Liberazione delle risorse del risultato */
function chiudi_recordset($risultato)
{
mysql_free_result($risultato);
}
function sql_esegui($sql)
{
mysql_query($sql)
or die("Query fallita ".$sql);
}
?>
[/php]
-
hai provato a farti visualizzare il risultato della query, ovvero il contenuto di $risultato?
-
eccolo pare che l'id lo trova ma solo quello è giusto o no trova altro?
echo $risultato;
Resource id #4
-
il codice scritto dal collega funzionava? tu hai toccato solo la query? se si, allora mi pare evidente che il problema è nella query. Hai provato a lanciare la query da un client MySQL per verificare cosa ritorna? Se ritorna quello che ti aspetti allora si cerca da qualche altra parte, altrimenti si aggiusta la query.
Io non sono risciuto a capire molto nel codice anche perchè dentro il forum risulta sformattato e confuso, a naso direi che la tua aggiunta della condizione in AND è sbagliata:
prima avevi:
** cond1=true or cond2=true**
poi:**
cond0=true and cond1=true or cond2=true**
secondo me andrebbe scritto
** cond0=true and (cond1=true or cond2=true)**
-
rilasciava tutti i dip
io ho aggiunto solo dipendenti.id_dip = $id_dip AND dopo il WHERE
[php]
if (isset($_SESSION['id_dip'])){
$id_dip=$_SESSION['id_dip'];
$query = "SELECT dipendenti.id_dip, dipendenti.id_liv, dipendenti.matricola, dipendenti.cognome, dipendenti.nome,
dipendenti.ore_ordinarie, presenze.stato_presenza, presenze.ore_assenza, presenze.ore_presenza,presenze.con_ticket
FROM dipendenti LEFT JOIN presenze ON (dipendenti.id_dip = presenze.id_dip
AND presenze.giorno = $giorno
AND presenze.mese = $mese
AND presenze.anno = $anno)";
$query = $query . " WHERE dipendenti.id_dip = $id_dip AND ((UNIX_TIMESTAMP('$anno-$mese-$giorno') - ";
$query = $query . " UNIX_TIMESTAMP( dipendenti.data_fine_rapp
)) <=0)";
$query = $query . " OR (UNIX_TIMESTAMP( dipendenti.data_fine_rapp
) =0)";
//$query = $query . " order by dipendenti.matricola";//Aggiungo il pulsante per il default....
$arg = $HTTP_SERVER_VARS['REQUEST_URI'];
$str = "";//Spaziatura
$str = $str . " <tr>\n </tr>\n";
$str = $str . " <tr>\n </tr>\n";
$str = $str . " <tr>\n </tr>\n";//Apertura della riga nella quale è contenuta
//la tabella per il form d'inserimento
$str = $str . " <tr>\n";//Apertura del form per l'inserimento delle presenze
$str = $str . " <form name='inserisci_presenze' method='post' action='ins_pres_exec.php'>\n";//Apre la tabella
$str = $str . " <table border='0' width='630px'>\n";//Intestazione della tabella
$str = $str . " <tr>\n";
$str = $str . " <td width='10px' class='testa'>Maticola</td>\n";
$str = $str . " <td class='testa'>Cognome</td>\n";
$str = $str . " <td class='testa'>Nome</td>\n";
$str = $str . " <td width='10px' class='testa'>Ore Ordinarie</td>\n";
$str = $str . " <td width='10px' class='testa'>Stato</td>\n";
$str = $str . " <td width='40px' class='testa'>Ore di presenza</td>\n";
$str = $str . " <td width='40px' class='testa'>Ore di Assenza o Straordinario</td>\n";
$str = $str . " <td width='40px' class='testa'>Con Ticket</td>\n";
$str = $str . " </tr>\n";//Dati della tabella (lista dei dipendenti)
$conn = apri_connessione();
$risultato = crea_recordset($query);while ($linea = mysql_fetch_array($risultato, MYSQL_ASSOC))
{
//Riga dei dati
$id_dip = $linea["id_dip"];$stato_presenza = $linea['stato_presenza'];
if($stato_presenza=='')
$stato_presenza = 'NOT_SET';
$stato_presenza_reale = $linea['stato_presenza'];
if($stato_presenza_reale=='')
$stato_presenza_reale = 'NOT_SET';if($stato_presenza=='NOT_SET')
$str = $str . " <tr class='corpo_non_set'>\n";
else
$str = $str . " <tr class='corpo'>\n";//scorro l'array $linea per salvare il valore del campo
$str = $str . " <td>" . $linea['matricola'] . "</td>\n";
$str = $str . " <td>" . $linea['cognome'] . "</td>\n";
$str = $str . " <td>" . $linea['nome'] . "</td>\n";
$str = $str . " <td>" . $linea['ore_ordinarie'] . "</td>\n";if(($_GET['stato_default']!='') && ($stato_presenza=='NOT_SET'))
$stato_presenza = $_GET['stato_default'];//Disegno l'input box per lo stato e per le ore di assenza
$str = $str . "<td>".html_optionbox_presenze('stato',$id_dip ,
$stato_presenza,$linea['ore_ordinarie'])."</td>";
//Campo ore presenza
$str = $str . " <td>\n";
$str = $str . " <input type='text' name='presenza" . $id_dip . "' id='testo" . $id_dip . "' ";
$str = $str . "value='" . ore_pres_dip($stato_presenza,$linea['ore_presenza'],$linea['ore_ordinarie']) . "' size='10'></input>\n";
$str = $str . " </td>\n";//Campo ore assenza
$disabilitato = "";
if($stato_presenza=='PRESENTE')
$disabilitato = 'disabled';$str = $str . " <td>\n";
$str = $str . " <input $disabilitato type='text' name='assenza" . $id_dip . "' id='aaaa" . $id_dip . "' ";
$str = $str . "value='" . ore_ass_dip($linea['ore_assenza']) . "' size='10'></input>\n";
$str = $str . " </td>\n";//Fine riga dei dati
//Campo verifica ticket
if($stato_presenza_reale=='NOT_SET')
$con_ticket = 'checked';
else
{
if($linea['con_ticket']=='1') $con_ticket = 'checked';
else $con_ticket = '';
}$str = $str . " <td>\n";
$str = $str . " <input type='checkbox' name='conticket" . $id_dip . "' id='conticket" . $id_dip . "' ";
$str = $str . "value='1' $con_ticket/>\n";
$str = $str . " </td>\n";
$str = $str . " </tr>\n";
}//Spaziatura
$str = $str . " <tr>\n </tr>\n";
$str = $str . " <tr>\n </tr>\n";
$str = $str . " <tr>\n </tr>\n";//Bottone submit
$str = $str . " <tr>\n";
$str = $str . " <td><input type='submit' name='Esegui' value='Applica'></td>\n";
$str = $str . " </tr>\n";//Chiusura della tabella
$str = $str . " </table>\n";//Passo come parametro anche la data
$str = $str . "<input type='hidden' name='gg' value='" . $giorno . "'>";
$str = $str . "<input type='hidden' name='mm' value='" . $mese . "'>";
$str = $str . "<input type='hidden' name='aaaa' value='" . $anno . "'>";//Chiusura del form
$str = $str . " </form>\n";//Chiusura della riga nella quale è contenuta
//la tabella per il form d'inserimento
$str = $str . " </tr>\n";
$str = $str . " </table>\n";
$str = $str . "</tr>\n";
$str = $str . "</table>";chiudi_recordset($risultato);
chiudi_connessione($conn);echo $str;
?>[/php]
per trovare un solo dip a questo punto così com'è li trova tutti e non va in errore m a ame serve solo il corrispondente dell ID inviato in sessione
-
ti sei perso il pezzo più importante della mia risposta
te lo traduco, usa le tre righe sotto:
$query = $query . " WHERE dipendenti.id_dip = $id_dip AND (((UNIX_TIMESTAMP('$anno-$mese-$giorno') - ";
$query = $query . " UNIX_TIMESTAMP( dipendenti.data_fine_rapp
)) <=0)";
$query = $query . " OR (UNIX_TIMESTAMP( dipendenti.data_fine_rapp
) =0))";
-
nel senso che non essendo esperto mi perdo proprio sulla tua trad... non ci arrivo..
ergo?mi puoi spiegare meglio?
grazie
-
direi che la tua aggiunta della condizione in AND è sbagliata:
prima avevi:
** cond1=true or cond2=true**
poi:**
cond0=true and cond1=true or cond2=true**
secondo me andrebbe scritto
** cond0=true and (cond1=true or cond2=true)ovvero:
** te lo traduco, usa le tre righe sotto:
$query = $query . " WHERE dipendenti.id_dip = $id_dip AND (((UNIX_TIMESTAMP('$anno-$mese-$giorno') - ";
$query = $query . " UNIX_TIMESTAMP( dipendenti.data_fine_rapp
)) <=0)";
$query = $query . " OR (UNIX_TIMESTAMP( dipendenti.data_fine_rapp
) =0))";SOSTITUISCI LE TRE RIGHE SOPRA ALLE CORRISPONDENTI SUL TUO CODICE
quale parte non è chiara?
-
ho fatto in questo modo:
$query = $query . " WHERE ((((UNIX_TIMESTAMP('$anno-$mese-$giorno') - UNIX_TIMESTAMP(dipendenti.
data_fine_rapp
)) <=0) OR (UNIX_TIMESTAMP(dipendenti.data_fine_rapp
) =0))) and dipendenti.id_dip = $id_dip";Pare funzionare!
anche se non ho ancora capito cosa volevi dire...:?
-
anche se non ho ancora capito cosa volevi dire...:?
-
quelli che hanno avuto pazienza e mi hanno aiutato!:)