funzione in_array gestita diversamente

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Salve a tutti, volevo esporre il mio problema.

Ho fatto un piccolo giochino per Facebook e ogni volta che un utente supera il livello l'app del gioco scrive sulla bacheca di quest'ultimo.

Il problema sorge quando devo gestire gli errori di Facebook. Mi sono reso conto che Facebook gestisce diverse tipologie di errori con lo stesso numero. Faccio un esempio:

Per l'errore numero #200 Facebook attribuisce sia il ban dell'applicazione, sia la non autorizzazione dell'utente a scrivere sulla propria bacheca.

Ovviamente in base al tipo di errore dovrò avere un comportamento diverso, quindi non posso gestire l'errore in base al numero ma in base al messaggio che le api di Facebook restituiscono.
Per esempio:
per il messaggio "Applicazione non autorizzata" che corrisponde al numero errore 200
per il messaggio "Applicazione sospesa" che corrisponde al numero errore 400

Comportamento => elimino l'applicazione

per il messaggio "Utente bannato" che corrisponde al numero errore 100
per il messaggio "Utente non esistente" che corrisponde al numero errore 200

Comportamento => elimino l'utente

Dopo questo preambolo, la soluzione che avevo pensato era la seguente:

Aggiungere in un primo array tutti i messaggi di errore che voglio gestire per il comportamento che prevede l'eliminazione dell'app:

PHP:
$errori_da_gestire_ELIMINA_APP=array("errore A", "errore B","errore C");

Aggiungere in un secondo array tutti i messaggi di errore che voglio gestire per il comportamento che prevede l'eliminazione dell'utente:
PHP:
$errori_da_gestire_ELIMINA_USER=array("errore D", "errore E","errore F");

Confrontare adesso i due array $errori_da_gestire con l'errore che viene restituito da Facebook "$stringa_Facebook":
PHP:
if (in_array($stringa_Facebook, $errori_da_gestire_ELIMINA_APP))
{
  echo "elemento trovato: funzione per eliminare l'app";
}elseif (in_array($stringa_Facebook, $errori_da_gestire_ELIMINA_USER))
{
  echo "elemento trovato: funzione per eliminare l'user";
}

Adesso, dov'è il problema?

Il problema è che questo script si trova all'interno di un cronjob, c'è un modo per alleggerire la cosa e rendere l'esecuzione più rapida?

Anche perchè dovrei fare svariati elseif :( questo era solo un esempio e ne è presente uno solo, ma nel mio caso dovrebbero essere una decina
 
Ultima modifica:
Ciao, potresti usare uno switch
PHP:
switch ($stringa_Facebook) {
    case "Applicazione non autorizzata":
    case "Applicazione sospesa":
        // elimino l'applicazione
        break;
    case "Utente bannato":
        // elimino utente
        break;
    default:
        // faccio altro
        break;
}
 
Avevo pensato ad una cosa del genere ma bisogna considerare che questo controllo si trova in un ciclo, non è che interrompendo questo ciclo con break; interrompono anche il ciclo superiore?

Inviato dal mio Nexus 4 con Tapatalk
 
No, all'interno dello switch il break interrompe solo la verifica dei case
 
In realtà avrei anche un'altra richiesta da farti, io ho strutturato lo script in modo che la parte variabile sia contenuta in un file chiamato config.php richiamato poi nel cron.php che è statica.

Vorrei che tali messaggi d'errore fossero inseriti nel config.php e che poi il cron.php li gestisca automaticamente. Per questo motivo avevo pensato agli array cosicché io potessi aggiungerne di nuovi all'interno del config e poin non toccare più nulla.

Non riesco a trovare una soluzione "dinamica" per il codice da te postato, idee?
 
Che brutta notizia!
lo switch è meno performante del if else ?
che delusione :dipser:
e se provi cosi ?
PHP:
$array = array(
    "messaggio1" => "eliminaUtente",
    "messaggio2" => "eliminaApplicazione",
    "messaggio3" => "eliminaUtente"
);

function eliminaUtente() {
    echo "elimina utente";    
}

function eliminaApplicazione() {
    echo "elimina applicazione";    
}

$stringa_Facebook = "messaggio3";

call_user_func($array[$stringa_Facebook]);
 
Che brutta notizia!
lo switch è meno performante del if else ?
che delusione :dipser:
e se provi cosi ?
PHP:
$array = array(
    "messaggio1" => "eliminaUtente",
    "messaggio2" => "eliminaApplicazione",
    "messaggio3" => "eliminaUtente"
);

function eliminaUtente() {
    echo "elimina utente";    
}

function eliminaApplicazione() {
    echo "elimina applicazione";    
}

$stringa_Facebook = "messaggio3";

call_user_func($array[$stringa_Facebook]);

Ma se devo utilizzare gli array, che differenza c'è con il codice postato su?

Edit: poi un'altra cosa non ho capito del codice appena postato, i messaggi possono essere multipli, cioè a messaggio1,messaggio7 deve corrispondere eliminaApplicazione (che in realtà è proprio il nome di una funzione già creata xD)

Dovrei fare un array di un array? e non sarebbe uguale a prima?
 
Ultima modifica:
differenza c'è con il codice postato sU
è un solo array anzichè due
non c'è nessauna condizione if else e nemmeno lo switch
ps:
forse non hai letto bene il codice che ti ho postato
 
Ultima modifica:
WOOOOOOOOOOOOOOOOO

Mi sento come un ragazzino con un giocattolo nuovo.
Funziona :D

Almeno funziona con una prova fatta al volo. Domani la provo su grande scala. :elvis::elvis:

Grazie Grazie Grazie
:mavieni:


EDIT: NOOOO ma se devo passare una variabile alla funzione?? ad es

eliminaSingoloUtente($id)
 
Provo a spiegarmi meglio anche per chi leggerà in futuro :
Crei un array che potrai inserire nel tuo config.php, basta che poi lo includi
utilizzi il messaggio di facebook come chiave e il nome della tua funzione come valore
PHP:
$array = array(
    "messaggio1" => "eliminaUtente",
    "messaggio2" => "eliminaApplicazione",
    "messaggio3" => "eliminaUtente"
);
poi ultilizzi il metodo call_user_func() per richiamare la funzione associata al messaggio di facebook
PHP:
$stringa_Facebook = "messaggio3";
call_user_func($array[$stringa_Facebook]);
 
puoi passare i parametri come secondo argomento, guarda sul manuale
PHP:
call_user_func($array[$stringa_Facebook],$id);
 
Provo a spiegarmi meglio anche per chi leggerà in futuro :
Crei un array che potrai inserire nel tuo config.php, basta che poi lo includi
utilizzi il messaggio di facebook come chiave e il nome della tua funzione come valore
PHP:
$array = array(
    "messaggio1" => "eliminaUtente",
    "messaggio2" => "eliminaApplicazione",
    "messaggio3" => "eliminaUtente"
);
poi ultilizzi il metodo call_user_func() per richiamare la funzione associata al messaggio di facebook
PHP:
$stringa_Facebook = "messaggio3";
call_user_func($array[$stringa_Facebook]);

Questo l'avevo capito e difatti ho fatto come hai detto. e la cosa funziona se bisogna far eseguire solo la funzione.

Il problema sorge ad esempio quando devo cancellare un utente:

PHP:
function eliminaSingoloUtente($id)
{
	$id=stripslashes($id);
	if(empty($id)) { echo "errore id vuoto!"; exit;}

	global $HOST, $DB_USER_NAME, $DB_USER_PWD, $DB;
	$link=mysql_pconnect($HOST, $DB_USER_NAME, $DB_USER_PWD); 
	mysql_select_db ($DB);

	$sql="delete from utenti where userid='".mysql_real_escape_string($id)."' limit 1";
	$result=mysql_query($sql) or die(mysql_error());
}

come vedi elimino l'utente in base all'id.

Come faccio a trasferire un ulteriore valore?

Mi spiego con un esempio:

config.php

PHP:
$array = array(
    "Massimo ha eliminato il tuo gioco" => "eliminaUtente",
    "messaggio2" => "eliminaApplicazione",
    "messaggio3" => "saltaApp"
); 

function eliminaUtente($id)
{
	$id=stripslashes($id);
	if(empty($id)) { echo "errore id vuoto!"; exit;}

	global $HOST, $DB_USER_NAME, $DB_USER_PWD, $DB;
	$link=mysql_pconnect($HOST, $DB_USER_NAME, $DB_USER_PWD); 
	mysql_select_db ($DB);

	$sql="delete from utenti where userid='".mysql_real_escape_string($id)."' limit 1";
	$result=mysql_query($sql) or die(mysql_error());
}
cron.php
PHP:
require_once "config.php";
$id="123";//sarebbe l'id di massimo
$stringa_Facebook = "Massimo ha eliminato il tuo gioco";
call_user_func($array[$stringa_Facebook]);


EDIT: postavo mentre mi avevi risposto, non me ne ero accorto lascio comunque questo codice per i posteri XD
 
Ultima modifica:

Discussioni simili