Modifica di un campo in funzione di un valore estratto, moltiplicando altri valori

  • Creatore Discussione Creatore Discussione Monital
  • Data di inizio Data di inizio

Monital

Utente Attivo
15 Apr 2009
778
2
18
Buonasera,

ormai frequento da un pò questo forum dove ho tratto parecchia ispirazione e sopratutto sono stato aiutato tantissimo per migliorare questa piccola passione nonostante non sia un programmatore.

Purtroppo,per voi ;) , devo attingere ancora al vostro sapere ma confido nel vostro buon cuore ed evitarmi un ricovero in psichiatria, dato che ancora una volta mi trovo su un problem ache mi sta facendo diventar matto.

Spiego il problema

Ho la solita tabella con circa 20.000 righe. ora io dovrei estrarrei dati contententi in un campo chiamato 'posizione' ed in base a questo modificare un altro campo chiamato 'valore' moltiplicando 3/4 campi

ad esempio se estrae 0 dal campo posizione deve moltiplicarmi il campo 2 il 3 ed il 4 ed inserire il risultato nel campo 'valore' etc.

questo lo deve fare per tutte le righe in maniera autonoma ed in funziona da cosa estrae dal campo 'posizione.

avevo usato uno script simile ma non riescoa farlo fungere mi và in loop lo script.

PHP:
$sqlquery = "SELECT * FROM tabella ORDER by ID";
$dati=array();
$result = mysql_query($sqlquery);
while ($linea = mysql_fetch_array($result, MYSQL_ASSOC)){
$dati[]= $linea['ID'];
}

foreach($dati as $key => $id) 
{ 
$value1 = $dati[$key]; 


$sql = "UPDATE tabella SET campox = '{$value1}' WHERE ID = '{$id}'"; 
mysql_query($sql) or die(mysql_error()); 
}

però modificando i campi in base alle mie esigenze facendo una prova su una riga non mi modifica niente anzi mi va in loop.

Peraltro nona vrei idea di come far moltiplicare i campi in funzione di cosa estrae.

Suggerimenti?
 
ciao
scusa ma forse non ti sei spiegato bene
hai una tabella del tipo
id posizione campo_1 campo_2 campo_3 campo_4 campox

in posizione hai i valori da zero a ??
se posizione == 0 cosa moltiplichi cioè quali campi tra loro?
e se posizione es. ==1 ecc..? cosa fai?

tirando un po' ad indovinare
se posizione ==0 fai campo_1 * campo_2 * campo_3 * campo_4
se posizione ==1 fai campo_2 * campo_3 * campo_4
se posizione ==2 fai campo_3 * campo_4
se posizione ==3 fai campo_4
e per quell'id uppi campox

sappimi dire se è così?
 
ciao
scusa ma forse non ti sei spiegato bene
hai una tabella del tipo
id posizione campo_1 campo_2 campo_3 campo_4 campox

in posizione hai i valori da zero a ??
se posizione == 0 cosa moltiplichi cioè quali campi tra loro?
e se posizione es. ==1 ecc..? cosa fai?

tirando un po' ad indovinare
se posizione ==0 fai campo_1 * campo_2 * campo_3 * campo_4
se posizione ==1 fai campo_2 * campo_3 * campo_4
se posizione ==2 fai campo_3 * campo_4
se posizione ==3 fai campo_4
e per quell'id uppi campox

sappimi dire se è così?

centro

solo che io vorrei farlo fare in automatico a tutti gli id senza che debba selezionarlo uno.

questo che in amniera che se mi si aggiorna la tabella mi basta far aprtire lo script e il campox mi si aggiorna in funzione degli altri campi.

ovviamente i campi da moltiplicare possono essere vari ma sempre nella stessa tabella
 
ciao
ti faccio un esempio con la tabella che avevo postato
PHP:
<?php
$q=mysql_query("SELECT * FROM tabella ORDER BY id");
while($riga=mysql_fetch_array($q)){
	switch(){
		case 0:$r=$riga['campo_1']*$riga['campo_2']*$riga['campo_3']*$riga['campo_4'];
		break;
		case 1:$r=$riga['campo_2']*$riga['campo_3']*$riga['campo_4'];
		break;
		case 2:$r=$riga['campo_3']*$riga['campo_4'];
		break;
		case 3:$r=$riga['campo_4'];
		break;
	}
	$up=mysql_query("UPDATE tabella SET campox=$r WHERE id=".$riga['id']);
}
?>
se lo lanci ti fa tutto in una volta, considera però che se hai 20.000 record ti conviene aumentare il tempo di vita dello script altrimenti corri il rischio che si blocchi
 
ciao
ti faccio un esempio con la tabella che avevo postato
PHP:
<?php
$q=mysql_query("SELECT * FROM tabella ORDER BY id");
while($riga=mysql_fetch_array($q)){
	switch(){
		case 0:$r=$riga['campo_1']*$riga['campo_2']*$riga['campo_3']*$riga['campo_4'];
		break;
		case 1:$r=$riga['campo_2']*$riga['campo_3']*$riga['campo_4'];
		break;
		case 2:$r=$riga['campo_3']*$riga['campo_4'];
		break;
		case 3:$r=$riga['campo_4'];
		break;
	}
	$up=mysql_query("UPDATE tabella SET campox=$r WHERE id=".$riga['id']);
}
?>
se lo lanci ti fa tutto in una volta, considera però che se hai 20.000 record ti conviene aumentare il tempo di vita dello script altrimenti corri il rischio che si blocchi

grazie borgo sempre gentilissimo, però ho tre domandine ancora

1) puoi spiegarmi questa cosa di "aumentare il tempo di vita"?

2)dato che hai moltiplicato direttamente le righe mi prendi impreparato, quindis e dovessia ggiungere delle variabili del tipo (seguendo il tuo esempio)
if posizione==2
(campo1*2+campo2*0.03+campo4)?

3)se volessi definire più posizioni? del tipo

if posiione==1 || posizione==3 ?
 
ciao
1)
il tempo di vita di uno script è il tempo massimo che uno script ha per essere eseguito.
il tempo di default è 30 sec (determinato in php.ini), cioè se lo script deve compiere moltissime elaborazioni e il tempo supera i 30 sec lo script si arresta.
nel tuo caso lo script deve fare un ciclo su 20.000 record
quindi deve estrarre il record, vedere cosa hai scelto, fare le moltiplicazioni, uppare il record
se per ipotesi per fare questo ci metta 0.01 sec, a fare 20.000 cicli ci mette 200 sec > di 30 sec, quindi lo script si arresta
quindi all'inizio dello script metti
PHP:
<?php
 set_time_limit(250);//o altro valore in secondi
 //...........

allungando così il suo tempo di vita
vedi: http://it2.php.net/manual/en/function.set-time-limit.php
2)
questo mi sembra semplice (se non ho capito male)
PHP:
switch(){
        //...
        break;
        case 2:$r=($riga['campo_1']*2+$riga['campo_2']*0.03+$riga['campo_4']);
        break;
       //.....
    }

!! guarda che nello switch mi era rimasto nella penna (tastiera)
PHP:
//...
switch($riga['posizione']){
        case 0:$r=......
//...

3)
non puoi più usare lo switch ma ricorrerre a if elseif (con o senza else)
PHP:
//...
if($riga['posizione']==0){
	//.....
}elseif($riga['posizione']==1 || $riga['posizione']==2){
	//......
}elseif($riga['posizione']==2){
//...
}
//....
 
ciao
intendevo perchè non si può usare in quasta maniera:

switch(){
case 0:$r=$riga['campo_1']*$riga['campo_2']*$riga['campo_3']*$riga['campo_4'];
break;
case 1 OR 2:$r=$riga['campo_2']*$riga['campo_3']*$riga['campo_4'];
break;
case 3:$r=$riga['campo_4'];
break;
}
o almeno secondo me non consigliabile
 
Ultima modifica:
Sì, invece. Si può usare esattamente come ti ho fatto vedere. Esempio:
PHP:
<?php
function switchTest($val)
{
    switch ($val) {
        case 'foo':
        {
            return 'foo';
            break;
        }

        case 'bar': case 'baz':
        {
            return 'bar or baz';
            break;
        }

        default:
        {
            return '?';
        }
    }
}

var_dump(switchTest('foo'));
var_dump(switchTest('bar'));
var_dump(switchTest('baz'));
var_dump(switchTest('boh'));
Visualizza:
Codice:
string(3) "foo"
string(10) "bar or baz"
string(10) "bar or baz"
string(1) "?"
 
grazie ragazzi.

allora mi ero accorto che mancava r['posizione'] nello switch, comunque nel mentre che aspettavo si è svegliata la mia vena creativa ed ho risolto con un if elseif, per quanto riguarda il tempo di vita dello script è abbastanza veloce ad uppare uqindi penso vada bene com'è

due cose

A) come mi ha ionsegnato unc erto alessandro l'up non andava perchè $r andava tra le parentesi graffe

quindi

PHP:
$up=mysql_query("UPDATE tabella SET campox=$r WHERE id=".$riga['id']);

non funge mentre
PHP:
$up=mysql_query("UPDATE tabella SET campox='{$r}' WHERE id=".$riga['id']);

va perfettamente.

B) vorrei capire la differenza del case con l'if, difatti sono riuscito a farlo con l'if tranqueillamente, forse si riaprmia del codice?

Grazie come sempre dell'aiuto
 
ciao
dipende da come hai setteto campox:
se campox è un intero e così il risultato della moltiplicazione, va bene anche senza apici, comunque le graffe non servirebbero (anche se alxex le ama molto)

PHP:
$up=mysql_query("UPDATE tabella SET campox='$r' WHERE id=".$riga['id']);

l'istruzione switch è come usare vari if/elseif/else, per quanto riguarda il risparmio di codice dipende.
ti conviene guardare
http://it.php.net/manual/en/control-structures.switch.php
 
ciao
dipende da come hai setteto campox:
se campox è un intero e così il risultato della moltiplicazione, va bene anche senza apici, comunque le graffe non servirebbero (anche se alxex le ama molto)

PHP:
$up=mysql_query("UPDATE tabella SET campox='$r' WHERE id=".$riga['id']);

l'istruzione switch è come usare vari if/elseif/else, per quanto riguarda il risparmio di codice dipende.
ti conviene guardare
http://it.php.net/manual/en/control-structures.switch.php

però senza graffe non mi uppava il campox che è settato Varchar

p.s ti chiederai del eprchè del Varchar,perchè il risultato delle moltiplicazioni mi servono epr impostare dei range, in realtà sul campo x non va un numero ma delle parole.

grazie della guida molto utile

p.s.2 vedendo che non me le uppava ho rpeferito provare le graffe prima di scrivere,sennò ale mi bacchettava ;)
 
ciao
inoltre lo switch sembrerebbe più veloce

PHP:
<?php
$a=3;
//con if elseif else
$inizio_if=microtime(TRUE);
if($a==1){
	echo "uno";
}elseif($a==2){
	echo "due";
}elseif($a>=3 && $a <=5){//oppure elseif($a==3 || $a==4 || $a==5)
	echo "non se se tre o quattro o cinque";
}elseif($a==6){
	echo "sei";
}else{
	echo "caso non previsto";
}
$durata_if=microtime(TRUE)-$inizio_if;
echo "<br>";
//con lo switch
$inizio_sw=microtime(TRUE);
switch($a){
	case 1: 
		echo "uno";break;
	case 2: 
		echo "due";break;
	case ($a>=3 && $a<=5): //oppure case ($a==3 || $a==4 || $a==5):
		echo "non se se tre o quattro o cinque";break;
	case 6: 
		echo "sei";break;
	default:
		echo "caso non previsto";break;
}
$durata_sw=microtime(TRUE)-$inizio_sw;
echo "<br><br>il costrutto if elseif impiega $durata_if sec<br>";
echo "il costrutto switch impiega $durata_sw sec<br><br>";
if($durata_sw > $durata_if){
	echo "lo switch è più lento degli if";
}elseif($durata_sw < $durata_if){
	echo "lo switch è più veloce degli if";
}else{
	echo "il tempo di esecuzione è uguale";
}
?>
questo è l'output
non se se tre o quattro o cinque
non se se tre o quattro o cinque

il costrutto if elseif impiega 6.91413879395E-5 sec
il costrutto switch impiega 1.00135803223E-5 sec

lo switch è più veloce degli if
 
WOW

tenendo presente che avevo già risolto con l'if dato che ho circa 30 valori da verificare mi son detto

e proviamolo sto switcho.

Funziona na roba esagerata senza contare che ci vuole molto meno a scrivere il codice ed ha aggiornato in un secondo

grande

ma si può usare anche per determinare maggiore minore?

del tipo se devo fare

if(x<5 && x<8) per includere i valori tra 5 e 8

si può usare los tesso lo switch?
 
un altra domanda

PHP:
$up=mysql_query("UPDATE tabella SET campox='$r' WHERE id=".$riga['id']);

$r e l'insieme dei valori estratti valori diciamo che vanno da 0 a 100

io ora in realta tramite un if elseif in campox gli faccio inserire dei dati del tipo

PHP:
if($r>90 && $r<95){
$x="Bravo";
}elseif($r>80 && $r<90){
$x="Mediocre";
}

e successivamente

PHP:
$up=mysql_query("UPDATE tabella SET campox='{$x}' WHERE id=".$riga['id']);

e se invece volessi saltare il passaggio dell'if e quindi ordinare la tabella per il valore più alto in $r e poi ai primi 50 assegnare "Bravo" e dal 51 al 150 "Mediocre" e così via.....

Come posso farlo?

con il ciclo for riesco ad estrarre secondo questo criterio ma non ho idea di come usarlo epr poi upparne il risultato

idee?
 
ciao
cosa intendi con
No, lo switch si può usare solamente per controllare se una stessa variabile è uguale ad un valore. Per istruzioni più complesse dovrai comunque usare if.
da manuale php
PHP:
case ($totaltime < 1):
		echo "That was fast!";
		break;

PHP:
case ($month=='Jan' || $month=='Feb' || $month=='Mar'): 
        $quarter = "Q1 2008"; 
        break;
 
un altra domanda

PHP:
$up=mysql_query("UPDATE tabella SET campox='$r' WHERE id=".$riga['id']);

$r e l'insieme dei valori estratti valori diciamo che vanno da 0 a 100

io ora in realta tramite un if elseif in campox gli faccio inserire dei dati del tipo

PHP:
if($r>90 && $r<95){
$x="Bravo";
}elseif($r>80 && $r<90){
$x="Mediocre";
}

e successivamente

PHP:
$up=mysql_query("UPDATE tabella SET campox='{$x}' WHERE id=".$riga['id']);

e se invece volessi saltare il passaggio dell'if e quindi ordinare la tabella per il valore più alto in $r e poi ai primi 50 assegnare "Bravo" e dal 51 al 150 "Mediocre" e così via.....

Come posso farlo?

con il ciclo for riesco ad estrarre secondo questo criterio ma non ho idea di come usarlo epr poi upparne il risultato

idee?

ho risolto estraendo i dati con LIMIT e poi assegno il dato al risultato della select e lo riuppo.
 

Discussioni simili