Problema if elseif o foreach.. o non capisco cosa non funzioni..

  • Creatore Discussione Creatore Discussione otto9due
  • Data di inizio Data di inizio

otto9due

Utente Attivo
22 Feb 2014
591
25
28
Ho creato questo script che dovrebbe avere il compito di aggiornare un campo del mio db "spedizione" nel mio db in base al risultato del parsing fatto..

Ora il meccanismo è questo ( a parte i commenti nel codice ):

1 - Estraggo dal db i prodotti di cui voglio modificare il campo spedizione ( che inizialmente sono settati come ND )
2- Inizio un foreach che conterrà:

Visto che non so in quale punto si trova il valore che mi interessa.. lo cerco..
( questo è un punto che vorrei capire bene )

3- Cerco di trovare 3 valori:
1) il valore contenuto in uno <b> figlio di span ( che chiamaiamo span1 )
2) il valore contenuto in uno span ( che chiamaiamo span2 )

3) il valore contenuto in uno span ( che chiamaiamo sped3p )

4- Avendo questi valori ( sempre nel foreach ) parto con un if elseif else
( e qui chiedo se ho fatto bene )

5- in base alla condizione dovrebbe aggiornare i record..

Ora il problema è essenzialmente uno.. MI carica sempre GRATIS ( quindi il risultato del primo if )

O in alcuni casi in base anche ad altri cambiamenti e prove ( sono 3 giorni che ci sbatto la testa giorno e notte )

Il primo prezzo .. secondo voi dove sbaglio, non so più che provare??

Le variabili vengono riempite.. Quello che non capisco e se seguono i cicli.. cioè il mio intento è quello di proporre ad ogni ciclo un valore diverso da valutare.. è corretto?

PHP:
			 /* Estraggo link e spedizione dei prodotti del db dove la spedizione = 'ND' */
			foreach ($prods as $prod) :
					
					 /* Parto col DOM alla ricerca della spedizione nella pag di dettaglio del prodotto */
					$html = file_get_contents($prod['linkprod']);

					$dom = new DOMDocument();
					@$dom->loadHTML($html);
			
							
					$xpath = new DOMXpath($dom);
			/* Rintraccio i diversi span che contengono la spedizione possono essere di due tipi.. */
			
					
					/* Rintraccio span di primo tipo ed estraggo il valore.. */
		 			 $spans = $xpath->query('//span[@class="a-size-base a-color-base"]');
						foreach($spans as $span) {
							
							 /* Estraggo valore contenuto tra i tag <b> */
							$speds = $xpath->query('.//b', $span);
								
								foreach ($speds as $sped) {
									$spedizione_new = $sped->nodeValue;
								}
							
					} /* chiudo foreach (spans as span) */
					
			/*  Rintraccio stringa ed estraggo il valore di tipo span 2.. */
		 			 $spans2 = $xpath->query('//span[@class="a-color-base a-text-bold"]');
						
						foreach($spans2 as $span2) {	
									$spedizione_new2 = $span2->nodeValue;
								}//chiudo foreach
				
							
			/* Fine Rintraccio i diversi span che contengono la spedizione.. */
			
			
			/* Rintraccio costo spedizione terze parti.. */
			 
				$prezzo_sped3ps = $xpath->query('//span[@class="a-size-small a-color-secondary shipping3P"]');
				
				foreach ($prezzo_sped3ps as $prezzo_sped3p) {
						preg_match_all('/((\d{1,3}),(\d{2}))/', $prezzo_sped3p->nodeValue , $res3p );
						$sped3p = $res3p[1][0].'€';
				}
			
			
			/* Fine costro di spedizione */
					
						
						 /* Controllo che il contenuto estratto sia = a spedizione gratuita
						 Aggiorno la spedizione al valore GRATIS se all'interno di spedizione/2 trovo la parola Spedizione.. */
						if (preg_match('/Spedizione/i', $spedizione_new) OR preg_match('/Spedizione/i', $spedizione_new2)){
								
							  include '../db/connection.php';
							  try
							  {
								$sql = 'UPDATE prodotti SET
									spedizione = :spedizione
									WHERE id = "'.$prod["id"].'"';

								$s = $pdo->prepare($sql);
								$s->bindValue(':spedizione', 'GRATIS');
								$s->execute();
							  }
							  catch (PDOException $e)
							  {
								$error = 'Error updating submitted author.';
								include '../db/ERRORDB/outputpage.php';
								exit();
							  }	
							  
						/* Se non trovo la stringa precedente controllo che $sped3p contenga almeno un numero.. */  						
				}else if (preg_match('/\d+/', $sped3p)) {
							  include '../db/connection.php';
							  try
							  {
								$sql = 'UPDATE prodotti SET
									spedizione = :spedizione
									WHERE id = "'.$prod["id"].'"';

								$s = $pdo->prepare($sql);
								$s->bindValue(':spedizione', $sped3p);
								$s->execute();
							  }
							  catch (PDOException $e)
							  {
								$error = 'Error updating submitted author.';
								include '../db/ERRORDB/outputpage.php';
								exit();
							  }	
						
						/* In ultima istanza se non trovo nulla di tutto ciò */ 
						}else{
							include '../db/connection.php';
							  try
							  {
								$sql = 'UPDATE prodotti SET
									spedizione = :spedizione
									WHERE id = "'.$prod["id"].'"';

								$s = $pdo->prepare($sql);
								$s->bindValue(':spedizione', 'ND');
								$s->execute();
							  }
							  catch (PDOException $e)
							  {
								$error = 'Error updating submitted author.';
								include '../db/ERRORDB/outputpage.php';
								exit();
							  }	
							
						} /* Chiudo IF sped GRATIS */
					

			endforeach; /* chiudo foreach (prods as prod) */

Grazie a quanti prendereanno parte..
 
Ultima modifica:
ciao
elseif non else if
da manuale php

PHP:
<?php

/* Incorrect Method: */
if($a > $b):
    echo $a." is greater than ".$b;
else if($a == $b): // Will not compile.
    echo "The above line causes a parse error.";
endif;


/* Correct Method: */
if($a > $b):
    echo $a." is greater than ".$b;
elseif($a == $b): // Note the combination of the words.
    echo $a." equals ".$b;
else:
    echo $a." is neither greater than or equal to ".$b;
endif;

?>
 
Pardon quella era l'ultima prova che ho dimenticato di eliminare prima di postare il codice ..
Li ho provati entrambi, per sicurezza sono andato a controllare anche io sul manuale cartaceo e dice questo, lo scrivo potrebbe servire anche ad altri..

la struttura corretta è come dici tu elseif ma c'è una nota sotto (per questo ho provato.. :P)
Anziché elseif, è prassi comune degli sviluppatori PHP usare la notazione else if tipica del C

Comunque ho fatto partire una prova dopo la modifica.. aspetto l'esito..

Sto notando ora che hai utilizzato i : questo secondo costrutto.. Che differenza c'è?
Dovrebbe essere, come per il foreach solo un secondo modo di scrivere la cosa.. giusto?
 
Ultima modifica:
ciao
è un tipo di notazione, io uso questa, mi trovo meglio con le {}
PHP:
<?php
if($a > $b){
    echo $a." is greater than ".$b;}
elseif($a == $b){ // Note the combination of the words.
    echo $a." equals ".$b;}
else{
    echo $a." is neither greater than or equal to ".$b;}
?>
comunque sono analoghe
 
Ho ottenuto risultati migliori facendo in questo modo..
PHP:
 /* Controllo che il contenuto estratto sia = a spedizione gratuita
						 Aggiorno la spedizione al valore GRATIS se all'interno di spedizione/2 trovo la parola Spedizione.. */
						if (preg_match('/Spedizione/i', $spedizione_new) OR preg_match('/Spedizione/i', $spedizione_new2)){
								
							  include '../db/connection.php';
							  try
							  {
								$sql = 'UPDATE prodotti SET
									spedizione = :spedizione
									WHERE id = "'.$prod["id"].'"';

								$s = $pdo->prepare($sql);
								$s->bindValue(':spedizione', 'GRATIS');
								$s->execute();
							  }
							  catch (PDOException $e)
							  {
								$error = 'Error updating submitted author.';
								include '../db/ERRORDB/outputpage.php';
								exit();
							  }	
							}  
						/* Se non trovo la stringa precedente controllo che $sped3p contenga almeno un numero.. */  						
				
						if (preg_match('/\d+/', $sped3p)) {
							  include '../db/connection.php';
							  try
							  {
								$sql = 'UPDATE prodotti SET
									spedizione = :spedizione
									WHERE id = "'.$prod["id"].'"';

								$s = $pdo->prepare($sql);
								$s->bindValue(':spedizione', $sped3p);
								$s->execute();
							  }
							  catch (PDOException $e)
							  {
								$error = 'Error updating submitted author.';
								include '../db/ERRORDB/outputpage.php';
								exit();
							  }	
						    }
						/* In ultima istanza se non trovo nulla di tutto ciò */ 
						if(!preg_match('/\d+/', $sped3p) AND !preg_match('/Spedizione/i', $spedizione_new) AND !preg_match('/Spedizione/i', $spedizione_new2)){
							include '../db/connection.php';
							  try
							  {
								$sql = 'UPDATE prodotti SET
									spedizione = :spedizione
									WHERE id = "'.$prod["id"].'"';

								$s = $pdo->prepare($sql);
								$s->bindValue(':spedizione', 'ND');
								$s->execute();
							  }
							  catch (PDOException $e)
							  {
								$error = 'Error updating submitted author.';
								include '../db/ERRORDB/outputpage.php';
								exit();
							  }	
							
						} /* Chiudo IF sped GRATIS */

Ma ancora qualcuno lo sbaglia.. non capisco perchè..
 

Discussioni simili