Newsgroup: it.comp.www.php
Titolo: lettura e modifica dati​

 lo script sottoriportato provvede a selezionare da un database dei 
record che soddisfano una certa condizione e successivamente sì 
provvede tramite la funzione update all'aggiornamento del Campo in base 
al valore ID.
 solo che ci dev'essere qualcosa che non va in quanto mi restituisce il 
seguente errore:
 
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL 
result resource in /prova.php 
 
 allego lo script
 
<?
include("config.inc.php");
$db = mysql_connect($db_host, $db_user, $db_password);
if ($db == FALSE)
die ("Errore nella connessione. Verificare i parametri nel file 
config.inc.php");
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database. Verificare i parametri 
nel file config.inc.php");
$query = "SELECT 
id,testoannuncio,titolo,data,email,provincia,bollettino,categoria,ref,in
vio FROM servizicitta WHERE bollettino = 'ATTIVATO' AND ref>1 AND 
invio=9";
$result = mysql_query($query, $db);
while ($row = mysql_fetch_array($result))
{ 
$testoannuncio = $row[testoannuncio];
$id = $row[id];
$titolo = $row[titolo];
$zona = $row[zona];
 
# AGGIORNAMENTO RECORD INVIO
###################
 
$query = "UPDATE servizicitta SET invio = 99 WHERE id='$row[id]'";
print $row[id];
$result = mysql_query($query, $db);
}
mysql_close($db);
 
?>
 

  allego lo script
 
In attesa dei superesperti di database bisogna che ti accontenti di 
quel che passa il convento ...
 
*not a valid resource* significa che non riesce ad eseguire la query di 
selezione.  $result non è ok.
 
L'errore dipende da errori di sintassi nella query oppure una query 
troppo complessa.
 
Per gli errori di sintassi la cosa più facile è guardare le query che 
fa il phpmyadmin. Quando ne fai una mette sempre anche la stringa in 
alto e sono perfette.
 
Per la query troppo complessa penso che sarebbe meglio non impostare in 
questo modo le condizioni  WHERE  AND  e  AND  ma usare delle subquery.
Un esempio di subquery che funziona è questo:
 
$sql = "SELECT * FROM (SELECT * FROM `table` WHERE `username`= 
'$servUser') AS sub WHERE sub.`campo` = 0 ORDER BY `campo1` DESC";
 
Bye
 
-- 
Alex
 
--- news://
freenews.netfront.net/
 - complaints: 
ne...@netfront.net
 ---

 $query = "UPDATE servizicitta SET invio = 99 WHERE id='$row[id]'"; 
 
Anche qui. Dovresti usare ...id='".$row['id]'."'";
 
 
Un paio di consigli:
 
- passa a PDO.
 
- se stai usando una versione di PHP inferiore alla 5.6, aggiorna almeno 
alla 5.6
 
- controlla la data dei tutorial/corsi/pezzi di codice che trovi su 
Internet. Se sono del 2015 va bene. 2014, decente. 2013 o precedenti, 
chiudi la pagina e non tornarci più. Se non hanno la data, dai per 
scontato che siano del 1995.
 
PHP, e tutto l'ecosistema intorno, è cambiato tantissimo negli ultimi 3-4 
anni.
 
Bye.
 

 
 
 ho fatto le modifiche da te indicate ma adesso su questa linea:​
 
$query = "UPDATE servizicitta SET invio = 9 WHERE id='".$row['id]'."'";
 
 mi dà il seguente errore​
 
Parse error: syntax error, unexpected ';', expecting ']' 
 
 mi potresti fornire lo script modificato secondo le tue indicazioni così 
lo provo e ti faccio sapere​
 

lo provo e ti faccio sapere
 
Una delle difficoltà che si trova quando si studia un nuovo linguaggio di 
programmazione è capire i messaggi d'errore, pare dicano altro. 
Ad esempio che c'entra il punto e virgola? C'entra nel modo di fare 
parsing di php e il messaggio di errore è effettivamente coerente con 
l'errore.
 
Se vuoi davvero imparare a programmare la correzione degli errori la 
devi fare da te. Anche se frequenti i migliori corsi, compri i libri degli 
illuminati, assumi Pelizzari per un anno consecutivo, 
per imparare a programmare il debug lo devi fare te.
 
Dopo il consiglio del saggio, i consigli pratici: 
usa un editor con la colorazione della sintassi;
se proprio non riesci a capire l'errore (male), cancella la riga e 
riscrivila da capo;
se passi più di un'ora dietro un detestabile messaggio d'errore, allora 
ci sono i millemila forum e gli NG ricolmi di gente a cui garbano i casi strani;
E il consiglio ultimo ma non ultimo:
se stai sviluppando un programma di spamming verrai brutalmente ucciso.

 
 
 scusami se insisto ma l'apice di chiusura di questa istruzione e come lo hai 
detto tu ma mi dà sempre errore mi puoi almeno postare solo questa semplice 
Liga corretta:​
 
$query = "UPDATE servizicitta SET invio = 9 WHERE id='".$row['id]'."'";
 
​ non faccio assolutamente spam
 
 
 

$query = "UPDATE servizicitta SET invio = 9 WHERE id='".$row['id]'."'";
 $query = "UPDATE servizicitta SET invio = 9 WHERE id='".$row['id']."'";
-----------------------------------------------------------------^^
 
Leonardo
-- 
 
A terrible beauty is born.
                                     - W. B. Yeats, Easter 1916

 Parse error: syntax error, unexpected ';', expecting ']'
 
Mea culpa. Gli editor che ti chiudono automaticamente le parentesi mi 
stanno rovinando la calligrafia. :D
 
Come dicono giustamente fmigliori e Leonardo, è $row['id'] con apici e 
parentesi chiuse nell'ordine corretto. 
 
Bye.
 
 

 
 
 con le modifiche da voi suggerite vi allego lo script modificato adesso mi dà 
il seguente errore
 
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result 
resource on line 13
 
 
allego codice
 
<?
include("area_riservata.php"); 
include("config.inc.php");
$db = mysql_connect($db_host, $db_user, $db_password);
if ($db == FALSE)
die ("Errore nella connessione. Verificare i parametri nel file 
config.inc.php");
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database. Verificare i parametri nel file 
config.inc.php");
$query = "SELECT 
id,testoannuncio,titolo,data,email,provincia,bollettino,categoria,ref,invio 
FROM servizicitta WHERE bollettino = 'ATTIVATO' AND ref>1 AND invio=9 ";
if (false === $result) {
 die(mysql_error());
}
while ($row = mysql_fetch_array($result))
{ 
# AGGIORNAMENTO RECORD INVIO
################################################################################
##############
$query = "UPDATE servizicitta SET invio = 99 WHERE id='".$row['id']."'";
if (false === $result) {
 die(mysql_error());
}
}
mysql_close($db);
?>
 

 result resource on line 13
 
Hai aggiunto il controllo di errore ma hai tolto l'esecuzione delle 
query... :)
 
Bye.

 ha scritto:

 scusa ma non capisco io non l'ho tolto l'esecuzione delle query ho solo 
seguito i vostri consigli ed ho modificato lo script​
 
 


Nel tuo primo post si trova la riga
 
$query = "SELECT ..."; 
$result = mysql_query($query, $db);  //<< intendo questa riga
while ($row = mysql_fetch_array($result)) 
 
dove $result veniva valorizzata con la risorsa dei dati ottenuti dalla query, quando hai modificato lo script l'hai cancellata
 
$query = "SELECT ...."; 
 
if (false === $result) { 
 die(mysql_error()); 
} 
 
dopo aver valorizzato la variabile $query con la stringa contenente la query da passare all'rdbms non esegui la query (mysql_query) ma verifichi che $result non sia false, ma $result non è nemmeno dichiarata.
 
Lo script deve diventare
 
$query = "SELECT ....";  //
$result = mysql_query($query, $db); 
if (false === $result) { 
 die(mysql_error()); 
} 
 
Buon lavoro

 Buon lavoro
 
 
 
 ho fatto le modifiche da te comunicate e adesso mi da questo errore
 
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result 
resource in //prova2.php on line 14
 
 
codice:
 
<?
include("area_riservata.php"); 
include("config.inc.php");
$db = mysql_connect($db_host, $db_user, $db_password);
if ($db == FALSE)
die ("Errore nella connessione. Verificare i parametri nel file 
config.inc.php");
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database. Verificare i parametri nel file 
config.inc.php");
$query = "SELECT 
id,testoannuncio,titolo,data,email,provincia,bollettino,categoria,ref,invio 
FROM servizicitta WHERE bollettino = 'ATTIVATO' AND ref>1 AND invio=9 ";
$result = mysql_query($query, $db); 
if (false === $result) {
 die(mysql_error());
}
while ($row = mysql_fetch_array($result))
{ 
# AGGIORNAMENTO RECORD INVIO
################################################################################
##############
$query = "UPDATE servizicitta SET invio = 99 WHERE id='".$row['id']."'";
$result = mysql_query($query, $db); 
if (false === $result) {
 die(mysql_error());
}
}
mysql_close($db);
?>
 
 

 resource in //prova2.php on line 14
 
è un errore logico, scommetto che ti modifica solo la prima riga.
 
Devi imparare l'sql altrimenti lo usi in maniera impropria. Per far funzionare il tuo programma dovresti usare due connessioni all'rdbms e causerebbe un numero imprecisato di query al posto di una ben fatta.
 
La query giusta è
 
UPDATE servizicitta SET invio = 99 WHERE bollettino = 'ATTIVATO' AND ref>1 AND invio=9
 
 

 $result = mysql_query($query, $db); 
 
E' questa la query che continua a non essere eseguita. Forse per 
sintassi ma spezzo una lancia in favore dell' uso di subquery.
Però non penso che possa essere fatta qui: a acchio ti occorre anche 
nidificarla e delle prove sono necessarie.


 ha scritto:

 come dici tu vengono aggiornate tutte le righe che soddisfano quella 
condizione io invece voglio che viene modificata solo una riga per volta in 
base al Campo ID
 
 mi spiego meglio:
 
 la prima query legge una riga che soddisfa quelle condizioni
 
 viene mandata un email al l'indirizzo di posta elettronica registrato su 
quella  riga
 
 dopo viene aggiornato il campo invio solo della riga a cui è stata mandata 
l'email
 

 fmigliori ha scritto:

Ho capito, nello script è omessa la parte d'invio email.
 
...
$query = "UPDATE servizicitta SET invio = 99 WHERE id='".$row['id']."'"; 
$result2 = mysql_query($query, $db);  // <<< Rinomina questa variabile
if (false === $result2) { 
...
 
 
Per abitudine preferisco isolare le due query con due connessioni, se possibile con transazioni, ma anche così ti dovrebbe funzionare. Questo script non credo funzioni correttamente in un regime di concorrenza, potresti avere email doppie e triple.

 Per abitudine preferisco isolare le due query con due connessioni, se 
possibile con transazioni, ma anche così ti dovrebbe funzionare. Questo 
script 
non credo funzioni correttamente in un regime di concorrenza, potresti 
avere 
email doppie e triple.
 
ottimo adesso lo script funziona correttamente
 
 cosa intendi per regime di concorrenza questo script lo uso solo io in 
modalità protetta per quale motivo dovrei avere le email doppie o triple
​
 
 


Perché se lo esegui due volte i destinatari non ancora processati dalla prima esecuzione attiva del programma, riceveranno due email.
 
Se poi mi dici che te non sbagli mai e sarai solo te ad accedere allo script, il problema non sussiste perché non ci sarà concorrenza tra i processi.