Pagina 1 di 2 12 UltimoUltimo
Visualizzazione risultati 1 fino 30 di 58

Discussione: Warning: Invalid argument supplied for foreach()

  1. #1
    Guest

    Predefinito Warning: Invalid argument supplied for foreach()

    Lo so che può sembrare una cosa più che stupida, ma cosa sbaglio qui?

    Codice PHP:
    foreach ($_POST['messaggi'] as $key => $m_id)
    {
    $query = mysql_query("delete from mp where id in ($cancella) ");
    }
    }
    devo eliminare dei record tramite checkbox

  2. #2
    L'avatar di mythologia
    mythologia non è connesso Moderatore
    Data registrazione
    05-01-2004
    Messaggi
    2,614

    Predefinito

    $_POST["messaggi"] non è un array, ma un elemento preciso dell'array $_POST (che poi nello specifico è ben più di un array). Per usare foreach, invece, è necessario specificare come argomento un array. Per maggiori info ti rimando a: http://php.net/manual/en/control-structures.foreach.php

  3. #3
    Guest

    Predefinito

    Scusa ma fancendo cosi,

    Codice PHP:
    <input type=\"checkbox\" name=\"messaggi[]\" value=\"".$row['id']."\" />
    non diventa un array? ovviamente tutto questa parte html è dentro un while...

  4. #4
    Guest

    Predefinito

    Perchè non usi gli apici al posto di fare tutti quei backslash, avresti minimo la metà di caratteri in meno...

    Vedendo $row['id'] suppongo quella stringa sia dentro un ciclo, quindi puoi fare così e sei sicuro:
    Codice PHP:
    echo '<input type="checkbox" name="messaggi[' . $row['id'] . ']" value="' . $row['id'] . '" />';
    Poi $cancella cosa è? Che senso ha fare quel foreach se al suo interno non utilizzi ne key ne value dell'array?

  5. #5
    L'avatar di mythologia
    mythologia non è connesso Moderatore
    Data registrazione
    05-01-2004
    Messaggi
    2,614

    Predefinito

    Forse sbaglio, ma credo si stia forzando la creazione di un array in modo erroneo. Ripeto, questo è un parere personale. Personalmente, però, posso dirti che tale genere di errore insorge solo quando hai "invalid arguments", come dice l'errore. Di fatto, l'unico argomento che gli passi è questa sorta di array. Non ho mai provato a forzare la creazione di un array tramite post, ma magari è possibile...

  6. #6
    Guest

    Predefinito

    Io ti posso dire che funziona perchè lo faccio, è l'unico modo per fare un form con dei checkbox. Io uso un template engine che, scrivendo così, mi stampa:
    Codice PHP:
    $user->lang['STYLES'] = array('Stile non definito', 'Stile 1', 'Syile 2', 'Stile3');

    foreach (
    $user->lang['STYLES'] as $i => $v)
    {
    # $i = equivale ad una key numerica
    # $v = equivale al valore di ogni key
    if ($i == 0)
    {
    continue;
    }

    $template->assign_block_vars('style', array(
    'ID' => $i,
    'NAME' => $v,
    'CHECK' => (in_array($i, (!request_var('style', array(0))) ? explode('-', $row['band_style']) : request_var('style', array(0)))) ? 'checked="checked"' : '',
    ));
    }
    Codice HTML:
    <!-- BEGIN style -->
    <label>
    	<input name="style[{style.ID}]" value="{style.ID}" type="checkbox" {style.CHECK} /><small>{style.NAME}</small>
    </label>
    <!-- END style -->
    Che mi genererebbe:
    Codice HTML:
    <label>
    	<input name="style[1]" value="1" type="checkbox" /><small>Stile 1</small>
    </label>
    <label>
    	<input name="style[2]" value="2" type="checkbox" /><small>Stile 1</small>
    </label>
    <label>
    	<input name="style[3]" value="3" type="checkbox" /><small>Stile 1</small>
    </label>
    E con:
    Codice PHP:
    implode('-', request_var('style', array(0)));
    creerebbe una stringa con tutti i valori separati da - che sono stati checkati.


  7. #7
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Vabbè tutto questo ragionamento per cosa? Lui ha fatto una semplice domanda.
    Come ti hanno detto $cancella a cosa serve?
    In breve:
    Codice PHP:
    foreach($_POST["messaggi"] as $value) { // ci serve solo il valore non la chiave...
    mysql_query("DELETE FROM mp WHERE id = '{$value}' LIMIT 1");
    }
    Mi sembra un pò eccessivo eseguire una query per ogni checkbox selezionata, di sicuro si può fare in un altro modo usando gli operatori logici (AND, OR).

    Saluti!

  8. #8
    Guest

    Predefinito

    Il mio era un esempio per rispondere a mythologia che dice che, secondo lui, zomer sta cercando di creare un array in modo errato

  9. #9
    L'avatar di Xsescott
    Xsescott non è connesso AlterGuru
    Data registrazione
    08-02-2004
    Messaggi
    1,413

    Predefinito

    Citazione Originalmente inviato da mycarlo Visualizza messaggio

    Mi sembra un pò eccessivo eseguire una query per ogni checkbox selezionata, di sicuro si può fare in un altro modo usando gli operatori logici (AND, OR).

    Saluti!
    e come?
    il problema sai qual'è? che i valori da cancellare non sono range, se fossero range e le query fossero tutte aggregati di successioni su interi allora la cosa sarebbe fattibile, ma se io faccio una cosa del genere:

    delete form tab where id => 5 and id <=10

    se io volessi eliminare i record da 5 a 10 con una sola query la cosa sarebbe fattibile, ma se volessi eliminare i record 3, 6 , 10 con una sola query?

    il problema stà che tu non puoi preventivare in che ordine i record verranno cancellati.

    ps. se esiste un qualche stratagemma per farlo,spigate please
    Ultima modifica di Xsescott : 21-11-2009 alle ore 15.12.11
    "Quando il potere dell'amore supererà l'amore per il potere il mondo conoscerà la pace" Jimmy Hendrix


    [ Richiesta: http://www.unibologna.eu/ ] --> [Risposta: http://www.magazine.unibo.it/Magazin...al_Portale.htm Morale] -->[ http://www.anti-phishing.it/news/art...s.13062007.php ]
    consoliwebsite.altervista.org

  10. #10
    Guest

    Predefinito

    Fare un ciclo o un implode() che genera una stringa con un AND insieme a tutti gli ID checkati e poi concatenare la stringa in un'unica query.

  11. #11
    L'avatar di Xsescott
    Xsescott non è connesso AlterGuru
    Data registrazione
    08-02-2004
    Messaggi
    1,413

    Predefinito

    Citazione Originalmente inviato da biccheddu Visualizza messaggio
    Io ti posso dire che funziona perchè lo faccio, è l'unico modo per fare un form con dei checkbox. Io uso un template engine che, scrivendo così, mi stampa:

    guarda che questo:
    Codice PHP:
    $user->lang['STYLES'] 0..n]
    e questo
    Codice PHP:
    $_POST["messaggi"]
    sono due cose diverse, perchè come giustamente mythologia dice uno è un elemento di un particolare array e uno è un array.

    Edit:

    Citazione Originalmente inviato da biccheddu Visualizza messaggio
    Fare un ciclo o un implode() che genera una stringa con un AND insieme a tutti gli ID checkati e poi concatenare la stringa in un'unica query.

    ok, non ho captio

    saresti cosi gentile da farmi un esempio?

    considera questa tabella

    id | utente
    0 xsescott
    1 biccheddu
    2 mythologia
    3 zomer
    4 mycarlo

    ora voglio eliminare con una query sola i valori i cui id valgono 0,2,3

    ...

    mycarlo tu dici di costruire la query volta per volta in base a quali elementi voglio cancellare?
    tipo: a=0 or a=2 or a=3 ?
    Ultima modifica di Xsescott : 21-11-2009 alle ore 16.42.06
    "Quando il potere dell'amore supererà l'amore per il potere il mondo conoscerà la pace" Jimmy Hendrix


    [ Richiesta: http://www.unibologna.eu/ ] --> [Risposta: http://www.magazine.unibo.it/Magazin...al_Portale.htm Morale] -->[ http://www.anti-phishing.it/news/art...s.13062007.php ]
    consoliwebsite.altervista.org

  12. #12
    Guest

    Predefinito

    Ora così su due piedi non mi viene, devo pensarci su e testare, però per farti un esempio che ptorebbe farti capire:

    Codice PHP:
    $sql_where = implode('AND id = ', $_POST['messaggi']);
    $sql = 'DELETE FROM tabella WHERE id <> 0 ' . $sql_where;
    Quindi, avresti:
    Codice:
    $sql = 'DELETE FROM tabella WHERE id <> 0 AND id = 2 AND id = 3
    Nons o se funziona, ma è la prima cosa che mi viene in mente.
    Ultima modifica di biccheddu : 21-11-2009 alle ore 15.32.08

  13. #13
    L'avatar di Xsescott
    Xsescott non è connesso AlterGuru
    Data registrazione
    08-02-2004
    Messaggi
    1,413

    Predefinito

    Citazione Originalmente inviato da biccheddu Visualizza messaggio
    Ora così su due piedi non mi viene, devo pensarci su e testare, però per farti un esempio che ptorebbe farti capire:

    Codice PHP:
    $sql_where = implode('AND id = ', $_POST['messaggi']);
    $sql = 'DELETE FROM tabella WHERE id <> 0 ' . $sql_where;
    Quindi, avresti:
    Codice:
    $sql = 'DELETE FROM tabella WHERE id <> 0 AND id = 2 AND id = 3
    Nons o se funziona, ma è la prima cosa che mi viene in mente.

    ok, capito il concetto!
    grazime mille!:)
    "Quando il potere dell'amore supererà l'amore per il potere il mondo conoscerà la pace" Jimmy Hendrix


    [ Richiesta: http://www.unibologna.eu/ ] --> [Risposta: http://www.magazine.unibo.it/Magazin...al_Portale.htm Morale] -->[ http://www.anti-phishing.it/news/art...s.13062007.php ]
    consoliwebsite.altervista.org

  14. #14
    L'avatar di mythologia
    mythologia non è connesso Moderatore
    Data registrazione
    05-01-2004
    Messaggi
    2,614

    Predefinito

    Xsescott ha capito esattamente quello che intendevo. Biccheddu, quello che fai te è profondamente diverso! Il mio dubbio sta nel fatto che si possa rendere un valore $_POST["messaggi"] un array. Non credo sia possibile scrivere un array in quel modo, semplicemente inserendo lo stesso nome (messaggi[] in questo caso) in tutti gli input. Mi sembra del tutto improbabile. Qui mi pare si stia tentando di usare l'html a mo' di php. A me non risulta che se chiamo due input allo stesso modo, poi nel $_POST["nomechehodato"] ottengo un array. Ripeto, magari sbaglio, ma a me non pare.
    Ultima modifica di mythologia : 21-11-2009 alle ore 16.03.38

  15. #15
    L'avatar di Xsescott
    Xsescott non è connesso AlterGuru
    Data registrazione
    08-02-2004
    Messaggi
    1,413

    Predefinito

    Citazione Originalmente inviato da mythologia Visualizza messaggio
    A me non risulta che se chiamo due input allo stesso modo, poi nel $_POST["nomechehodato"] ottengo un array.

    infatti non è assolutamente cosi, l'ultimo input con quell'indice viene selezionato e inviato di solito.
    biccheddu c'è un esempio dove tu mi hai risposto che "io non leggo i post prima di rispondere" (e ti do ragione), ma a quanto vedo ci possiamo dare la mano a riguardo

    leggiti il primo script che ho postato e noterai come sono stato costretto a passare i valori post ;)
    Ultima modifica di Xsescott : 21-11-2009 alle ore 16.39.03
    "Quando il potere dell'amore supererà l'amore per il potere il mondo conoscerà la pace" Jimmy Hendrix


    [ Richiesta: http://www.unibologna.eu/ ] --> [Risposta: http://www.magazine.unibo.it/Magazin...al_Portale.htm Morale] -->[ http://www.anti-phishing.it/news/art...s.13062007.php ]
    consoliwebsite.altervista.org

  16. #16
    Guest

  17. #17
    L'avatar di mythologia
    mythologia non è connesso Moderatore
    Data registrazione
    05-01-2004
    Messaggi
    2,614

    Predefinito

    Lui non sta usando indici diversi! Lascia lo stesso nome all'indice di ciascun input!

    Codice PHP:
    <input type="checkbox\" name=\"messaggi[]\" value=\"".$row['id']."\" />
    Questo è ciò che ha postato, questo non fa quello che vuole. Sta forzando la creazione di un array, che di fatto non c'è. SE e dico SE avesse cambiato gli indici sarebbe stato un discorso profondamente diverso.

  18. #18
    L'avatar di Xsescott
    Xsescott non è connesso AlterGuru
    Data registrazione
    08-02-2004
    Messaggi
    1,413

    Predefinito

    Citazione Originalmente inviato da biccheddu Visualizza messaggio
    Ora così su due piedi non mi viene, devo pensarci su e testare, però per farti un esempio che ptorebbe farti capire:

    Codice PHP:
    $sql_where = implode('AND id = ', $_POST['messaggi']);
    $sql = 'DELETE FROM tabella WHERE id <> 0 ' . $sql_where;
    Quindi, avresti:
    Codice:
    $sql = 'DELETE FROM tabella WHERE id <> 0 AND id = 2 AND id = 3
    Nons o se funziona, ma è la prima cosa che mi viene in mente.

    comunque oltre al fatto che qui hai fatto un implode su un elemento di un array(quindi qui paradossalmente il tuo discorso crolla), la query fallisce perchè il valore di id non potra mai essere uguale a 2 e a 3.
    Ultima modifica di Xsescott : 21-11-2009 alle ore 16.26.40
    "Quando il potere dell'amore supererà l'amore per il potere il mondo conoscerà la pace" Jimmy Hendrix


    [ Richiesta: http://www.unibologna.eu/ ] --> [Risposta: http://www.magazine.unibo.it/Magazin...al_Portale.htm Morale] -->[ http://www.anti-phishing.it/news/art...s.13062007.php ]
    consoliwebsite.altervista.org

  19. #19
    Guest

    Predefinito

    Perchè no scusa? Non ci sto capendo più nulla

  20. #20
    L'avatar di Xsescott
    Xsescott non è connesso AlterGuru
    Data registrazione
    08-02-2004
    Messaggi
    1,413

    Predefinito

    Citazione Originalmente inviato da biccheddu Visualizza messaggio
    Perchè no scusa? Non ci sto capendo più nulla

    semplicemente perche 2!=3

    se id ora è 2 non può essere anche 3, il where viene valutato su ogni record.
    "Quando il potere dell'amore supererà l'amore per il potere il mondo conoscerà la pace" Jimmy Hendrix


    [ Richiesta: http://www.unibologna.eu/ ] --> [Risposta: http://www.magazine.unibo.it/Magazin...al_Portale.htm Morale] -->[ http://www.anti-phishing.it/news/art...s.13062007.php ]
    consoliwebsite.altervista.org

  21. #21
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Forse bisogna usare OR ma non ne sono sicuro...

    Saluti!

  22. #22
    Guest

    Predefinito

    inviato da biccheddu: Perchè no scusa? Non ci sto capendo più nulla
    Concordo in poche parole a me serve qualcosa come sta nel panello di AV.

    Ecco cosa faccio io facico una query alla tabella mp e prendo tutti i messaggi che hanno come desntinatario il mio nome poi, faccio un mysql_fecth_array e facico un while ora io vorrei che in si possano creare delle checkbox affianco ad ogni messaggio cosi che cliccandoci io possa scegliere quali messaggi eliminare poi, e infine un smeplice bottone che mi permette di inviare la richiesta

    Ora come devo fare il sistema di eliminazione?

  23. #23
    L'avatar di andreafallico
    andreafallico non è connesso Super Moderatore
    Data registrazione
    02-06-2009
    Messaggi
    1,981

  24. #24
    Guest

    Predefinito

    il codice è questo

    Codice PHP:
    <?php
    $name_inp
    = (!empty($_POST['delet'])) ? trim($_POST['delet']) : '';
    $name = addslashes($name_inp);
    if(
    $name != null && $name != ''){
    include(
    "config.inc.php");
    $db = mysql_connect($host, $username);
    if (
    $db == FALSE)
    die (
    "Errore nella connessione. Verificare i parametri.");

    mysql_select_db($database, $db) or die ("Errore nella selezione del database. Verificare i parametri.");
    $result = mysql_query("DELETE FROM calcetto_nextmatch WHERE id='$name'") or die(mysql_error());
    echo(
    "The record has been deleted");
    mysql_close($db);
    }
    ?>
    non voglio mettere un bottone ad ogni immagine io voglio fare qualvosa dle genere


  25. #25
    L'avatar di andreafallico
    andreafallico non è connesso Super Moderatore
    Data registrazione
    02-06-2009
    Messaggi
    1,981

    Predefinito

    Infatti non ci sono bottoni per ogni riga.
    Leggi bene qui: comando DELETE per eliminare dati da form, l'unica cosa differente è type=radio invece del checkbox, quindi non è possibile fare eliminazioni multiple, però se modifichi quel codice è possibile.

  26. #26
    Guest

    Predefinito

    Citazione Originalmente inviato da andreafallico Visualizza messaggio
    Infatti non ci sono bottoni per ogni riga.
    Leggi bene qui: comando DELETE per eliminare dati da form, l'unica cosa differente è type=radio invece del checkbox, quindi non è possibile fare eliminazioni multiple, però se modifichi quel codice è possibile.
    E come fa vBulletin? phpbb2? phpbb3? IPB?

    Prova così:
    Codice PHP:
    $sql_where = implode(', ', $_POST['messaggi']);
    $sql = 'DELETE FROM tabella WHERE id IN (' . $sql_where . ')';

  27. #27
    L'avatar di Xsescott
    Xsescott non è connesso AlterGuru
    Data registrazione
    08-02-2004
    Messaggi
    1,413

    Predefinito

    Citazione Originalmente inviato da biccheddu Visualizza messaggio
    Codice PHP:
    $sql = 'DELETE FROM tabella WHERE id IN (' . $sql_where . ')';
    Considerando che in teoria il predicato IN dovrebbe essere equivalente al predicato = ANY
    considerando che questi predicati vengono usati per le query nidificate.
    indi per cui, sapendo che:

    (id IN (1,2,3,4)) = (id = ANY(1,2,3,4))

    come faccio a scrivere correttamente ciò che è nell'espressione a sinistra nella forma dell'espressione a destra?

    ovviamente vorrei capire come costruire luna query di selezione in mysql.
    grazie a chi mi darà una mano :)
    "Quando il potere dell'amore supererà l'amore per il potere il mondo conoscerà la pace" Jimmy Hendrix


    [ Richiesta: http://www.unibologna.eu/ ] --> [Risposta: http://www.magazine.unibo.it/Magazin...al_Portale.htm Morale] -->[ http://www.anti-phishing.it/news/art...s.13062007.php ]
    consoliwebsite.altervista.org

  28. #28
    L'avatar di mythologia
    mythologia non è connesso Moderatore
    Data registrazione
    05-01-2004
    Messaggi
    2,614

    Predefinito

    Non ho capito la tua richiesta, Xsescott.

  29. #29
    L'avatar di Xsescott
    Xsescott non è connesso AlterGuru
    Data registrazione
    08-02-2004
    Messaggi
    1,413

    Predefinito

    Citazione Originalmente inviato da mythologia Visualizza messaggio
    Non ho capito la tua richiesta, Xsescott.
    niente, quando usi IN puoi passargli direttamente i valori come stringa separati da virgola, e lui fa ciò che deve fare.

    select * form tab where in (1,3,5)

    seleziona le query 1,3,5

    in teoria, e dico in teoria, IN è un predicato per le subquery, ma guardacaso riesco ad usarlo anche passandogli dei valori separati da virgola, come su...


    mentre, l'operatore ANY, dovrebbe restituire i record se vi è almeno uno di quei valori che si risolve con l'operatore che lo precede con il risultato della select contenuta in any.

    quindi, in teoria

    select * from tab where y = any(1,3,5)
    dovrebbe in teoria fare la stessa cose, ma mysql mi spara un errore per la sintassi..

    ora mi chiedevo se era dovuto al fatto che any lo si puoi usare solo nella forma

    select * from tab where y = any (select y tab where x = 1 or x=3 or x=5)

    oppure esiste una forma piu esplicita, tipo passandogli array, lista esplicita o variabili in qualche ordine particolare??

    ripeto, con in basta fare IN (1,3) e lui accetta il fatto che il confronto venga fatto con quei valori dentro le parentesi...invece con any, errore si sintassi..

    qualcuno riesce a risolvere questo dilemma ??
    grazie ancora :D
    "Quando il potere dell'amore supererà l'amore per il potere il mondo conoscerà la pace" Jimmy Hendrix


    [ Richiesta: http://www.unibologna.eu/ ] --> [Risposta: http://www.magazine.unibo.it/Magazin...al_Portale.htm Morale] -->[ http://www.anti-phishing.it/news/art...s.13062007.php ]
    consoliwebsite.altervista.org

  30. #30
    L'avatar di mythologia
    mythologia non è connesso Moderatore
    Data registrazione
    05-01-2004
    Messaggi
    2,614

    Predefinito

    E' proprio la sintassi a volere ciò. In si può usare sia come:
    IN(value1, value2, ...)
    che come
    IN(subquery).

    Al contrario, ANY ha solo la forma:
    ANY(subquery)

Pagina 1 di 2 12 UltimoUltimo

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •