Scorporare array e recuperare record tabella

Riccardo Contu

Utente Attivo
14 Lug 2019
25
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

Utente Attivo
14 Lug 2019
25
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

Utente Attivo
14 Lug 2019
25
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

Utente Attivo
14 Lug 2019
25
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

Utente Attivo
14 Lug 2019
25
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.
 
Discussioni simili
Autore Titolo Forum Risposte Data
otto9due Leggere valore da array multidimensionale a chiavi dinamiche PHP 1
M Passaggio variabili array php su un tasto jq PHP 3
M Somma inversa di Array C/C++ 2
MarcoGrazia Iterazione array PHP 5
N Passare array da php a javascript PHP 5
G Ordinare un array multidimensionale PHP 4
H Errore su array associativo PHP 1
K Array senza ripetizioni Presentati al Forum 4
A Gestione array multidimensionale PHP 6
otto9due Più chiavi in array con array_key_exists() PHP 0
M Array associativi php su 2 campi mysql PHP 10
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
T PROBLEMA CON ARRAY PHP 8
L Sessione e array per utenti PHP 0
R Importazione csv su mysql tramite array PHP 2
elpirata Ricavare e stampare indirizzo ip da array associativo PHP 0
P Ciclare tra array di oggetti PHP 1
R Raggruppare valori array PHP 5
S Come conoscere la posizione di numeri in un array escludendo i doppioni PHP 4
D Popolare array PHP 8
R Includere elementi array fra apici PHP 1
P Array da foreach PHP 2
N Variabile di sessione è un array PHP7 PHP 3
A Contare gli elementi di un array PHP 13
A Importare array in mysql PHP 1
A Array di immagini Sviluppo app per Android 10
D Chiave unica in estrazione dati da array php PHP 0
D Spazio vuoto in un elemento di un array php PHP 2
S Come filtrare valori di un array PHP 4
mazman mysqli_query() mi ritorna un array vuoto anche se presente un record nella tabella PHP 13
A Non è un array e nemmeno un intero, che tipo di dato è? Javascript 1
max1974 PHP, Array Multidimensionale e Grafici PHP 22
S [PHP] Confrontare due array con valori quasi uguali PHP 2
MarcoGrazia [PHP] Unioni di due array con somma di valori PHP 6
R [PHP] Visualizzazione dati Array PHP 2
S [PHP] Eliminare doppioni array e rinumerare le posizioni PHP 2
M Importare - Manipolare Json Array Sviluppo app per Android 2
M [PHP] Problemi su inserimento array nel db PHP 7
M [PHP] Visualizzare un array partendo dal numero 1 e non 0 PHP 5
G [ASP] Ciclare i valori di 2 array Classic ASP 2
S [PHP] Estrarre elementi array su più variabili PHP 5
S [PHP] Estrarre dati tabella in diversi array PHP 2
max1974 [PHP] Raggruppare array PHP 4
A [PHP] Caricamento database in array PHP 11
G sql select con array in php PHP 1
L [Java] Aggiungere elementi ad array JSON Java 0
S [PHP] individuare chiave elemento array PHP 7
A [PHP] Script con array con numeri che iniziano per 00 PHP 2
Emix [Javascript] Somma con array input HTML Javascript 1
S [PHP] selezionare colonna tabella utilizzando un array PHP 1

Discussioni simili