Scorporare array e recuperare record tabella

Riccardo Contu

Nuovo Utente
14 Lug 2019
16
0
1
Buongiorno,

sto utilizzando questa funzione per recuperare dati da una selezione multipla di checkbox:

PHP:
$id = $_POST['id'];
if( is_array($id) ) {
echo "Elementi selezionati: ".count($id)."<br/>";
   echo "-> ".reset($id);
   while( $elemento = next($id) ) echo "-> $elemento <br/>";
}
Ottengo quindi il seguente risultato:

Codice:
Elementi selezionati: 5
-> 55-> 54
-> 53
-> 52
-> 51
Volevo sapere come posso scorporare l'array ottenendo poi con una select gli altri dati relativi agli id contenuti nell'array stesso. In sostanza vorrei recuperare dal database mysql tutti i dati di ciascuna riga relativa agli id 55, 54, 53 e 51.

So che provando con SELECT * FROM lista ORDER BY id WHERE id=$id non ottengo ovviamente il risultato desiderato.

Potreste aiutarmi?
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
Puoi recuperare un range se consecutivo con BETWEEN 51 AND 55 o WHERE id > 50 AND < 56
Per maggiori info ecco anche IN dove puoi effettivamente scegliere cosa cercare, anche il non consecutivo.
L'unica cosa a lasciarmi perplesso è l'ordinamento decrescente anche se hai usato reset ma va beh questo non è poi così importante.
 

Riccardo Contu

Nuovo Utente
14 Lug 2019
16
0
1
Allora sto provando così

PHP:
$res = "'".implode("','", $id)."'";
$result = mysql_query("SELECT * FROM lista WHERE id IN ('$res')");
Solo che adesso non so come tirare fuori i risultati
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
PHP:
$_POST['id'][0] = '55';
$_POST['id'][1] = '54';
if( isset($_POST['id']) )
if( is_array($_POST['id']) ) {
    $start = reset($_POST['id']);
    $end = end($_POST['id']);
    $count = count($_POST['id']);
    $local_key = array();
    $var = 0;

   $i = 0;
   while( isset($_POST['id'][($i++)]) && !is_array($_POST['id'][($i-1)]) && $i <= $count) {
       if(($i-1) == 0 || ($i-1) && ( ( (int) $_POST['id'][($i-2)]) - ( (int) $_POST['id'][($i-1)]) ) == 1)
            $var += 1;
        $local_key[] = (int) $_POST['id'][($i-1)];
    }
}

if(count($local_key) != $count) {
    //Hacker Attack
    unset($_POST['id']);
} elseif($var == 2 && $var == $count) {
    $string = 'id BETWEEN ' . $end . 'AND' . $start;
    //$string = 'WHERE id > ' . ($end - 1) . ' AND id < ' . ($start +1);
} elseif(count($local_key) == $count) {
    if($var == 1) {
        $string = 'WHERE id = ' . $end;
    } else {
        $string = 'id IN(' . implode(",", $local_key) . ')';
    }
}
unset($start, $end, $count, $local_key, $var);
if($string)
echo 'SELECT * FROM table '. $string;
Non conosco la tua libreria/funzione per generare/validare l'invio POST di dati stringa che dovranno essere necessariamente decimali, oltretutto non so nemmeno se esiste anche la possibilità di utilizzare un array a una sola dimensione per unico valore.
Va beh se il codice usato filtra i dati POST puoi anche togliere isset e !is_array dentro al ciclo while.
 

Riccardo Contu

Nuovo Utente
14 Lug 2019
16
0
1
Allora mi spiego meglio:

ho una pagina con una tabella le cui righe possono essere selezionate tutte o solo alcune tramite dei checkbox che assumono il valore 'id'. Poi tramite un pulsante passo tutti gli id selezionati a un'altra pagina dove voglio che compaia la scritta "hai selezionato Nome_Prodotto1, Nome_Prodotto2, Nome_Prodotto3 ecc. in base a quelli selezionati con i checkbox. Il Nome Prodotto deve essere recuperato da una tabella mysql in riferimento agli id selezionati.

Poi tramite gli id che ho passato a questa seconda pagina devo eseguirò altre operazioni secondarie( per esempio eliminare i record selezionati o modificarli) però quelle che mi serve per ora è questo.
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
Ho aggiornato il codice perché non ho definito $string, dovevo sostituire da $var == 2 a $var > 1 e aggiungere gli spazi bianchi a AND di BETWEEN.
<input type="checkbox" name="id[]" value="10"/> id nome prodotto<br/><br/> questo o i successivi crea un array a due dimensioni $_POST['id'][0] i successivi possono e devono essere numerati dal numero successivo a zero.
L'istruzione sql recupera le colonne id e NomeProdotto sia che è una row o più (fetch_assoc restituirà null quando raggiunge la fine).
Scusami mi sono spiegato per chiarezza e spero a mia volta di aver capito il tuo bisogno d'uso.
PHP:
if( isset($_POST['id']) )
if( is_array($_POST['id']) ) {
    $start = reset($_POST['id']);
    $end = end($_POST['id']);
    $count = count($_POST['id']);
    $local_key = array();
    $var = 0;
    $string = '';

   $i = 0;
   while( isset($_POST['id'][($i++)]) && !is_array($_POST['id'][($i-1)]) && $i <= $count) {
       if(($i-1) == 0 || ($i-1) && ( ( (int) $_POST['id'][($i-2)]) - ( (int) $_POST['id'][($i-1)]) ) == 1)
            $var += 1;
        $local_key[] = (int) $_POST['id'][($i-1)];
    }
}

if(count($local_key) != $count) {
    //Hacker Attack
    unset($_POST['id']);
} elseif($var > 1 && $var == $count) {
    $string = 'id BETWEEN ' . $end . ' AND ' . $start;
    //$string = 'WHERE id > ' . ($end - 1) . ' AND id < ' . ($start +1);
} elseif(count($local_key) == $count) {
    if($var == 1) {
        $string = 'WHERE id = ' . $end;
    } else {
        $string = 'id IN(' . implode(",", $local_key) . ')';
    }
}
unset($start, $end, $count, $local_key, $var);
if($string) {
$sql = 'SELECT id,NomeProdotto FROM table '. $string;
// Using iterators (support was added with PHP 5.4)
foreach ( $conn>query($sql) as $row ) {
    printf("'%s' '%s'\n", $row['id'], $row['NomeProdotto']);
}

// Not using iterators
$result = $conn->query($sql);
while ($row = $result->fetch_assoc()) {
    printf("'%s' '%s'\n", $row['id'], $row['NomeProdotto']);
}
}
Ecco qui un un'esempio stile orientato agli oggetti con due possibili istruzioni sql ma con medesimo risultato.
Per favore puoi provare, ricordo solo array a due dimensioni altrimenti con poco adatti il codice per un array mono
 

Riccardo Contu

Nuovo Utente
14 Lug 2019
16
0
1
Con entrambe le alternative ottengo il seguente errore:

Codice:
Fatal error: Uncaught Error: Call to undefined function query() in C:\... Stack trace: #0 {main} thrown in C:\...
 

Riccardo Contu

Nuovo Utente
14 Lug 2019
16
0
1
Ho risolto così:

PHP:
$id = $_POST['id'];

$string = implode(" OR id = ", $id);

$query = mysql_query("SELECT * FROM lista WHERE id = $string");

while($row = mysql_fetch_array($query)) {
    
    extract ($row);

echo "$id";

}
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
La soluzione è unicamente per testare questo script perché extract non si usa su input non generato da te proveniente esternamente al codice php, stesso discorso per mysql senza Prepared Statement altresi adesso si usa la libreria mysqli leggi il contenuto del link che ti ho fornito prima c'è anche lo stile procedurale.
Ma va beh non lo capirai e si traduce che ho perso tempo.
Warning
Do not use extract() on untrusted data, like user input (i.e. $_GET, $_FILES, etc.). If you do, for example if you want to temporarily run old code that relied on register_globals, make sure you use one of the non-overwriting flags values such as EXTR_SKIP and be aware that you should extract in the same order that's defined in variables_order within the php.ini.
Warning
This is not recommended practice and is only documented here for completeness. The use of register_globals is deprecated and calling extract() on untrusted data such as $_FILES is, as noted above, a potential security risk. If you encounter this issue, it means that you are using at least two poor coding practices.