funzione che sposta record in alto o in basso ... come?

Cerco un script .... penso sia un omando SQL che mi modifichi la posizione (ordine di visualizzazione) dei record di una tabella.

In pratica in una pagina ho l'elenco di questi record con 2 link di fianco a ciascuno di essi (sposta sopra, sposta sotto) che dovrebbero attivare il comando SQL .....

La posizione dei record l'ho memorizzata in un campo INT(11) .... è corretto ????

Qualcuno mi può illuminare sul come procedere concretamente ..... o se esite un tutorial a tale proposito.

inviato 9 anni fa
ninext
modificato 9 anni fa
X 0 X

devi fare una sostituzione di "posto" a mano. Esempio il record B, di posizione 12, deve salire, quindi deve prendere il posto del record A di posizione 10 (non è sicuro che le posizioni siano contigue poiché potresti fare delle cancellazioni)

1) cerca la posizione del record A con una select del tipo

SELECT posizione FROM nometabella WHERE posizione < 12 ORDER BY posizione DESC LIMIT 1

2) con 2 UPDATE scambia le posizioni del record A e del record B

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

C'era già stata una discussione su questo problema! ;P

risposto 9 anni fa
LonelyWolf
X 0 X

mi posti il link???

risposto 9 anni fa
ninext
X 0 X
risposto 9 anni fa
LonelyWolf
X 0 X

Non è proprio quello che cercavo ....

risposto 9 anni fa
ninext
X 0 X
Non è proprio quello che cercavo ....

Che ne pensi del mio suggerimento? Lo ritieni fattibile?

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

mmh...intendi creare una lista dove puoi spostare le voci,magari di un menu, dalla posizione 11 alla 5 tramite delle icone, o giù di lì ?

se è così dovresti mettere un'altro campo nella tabella contenente la posizione assoluta dell'elemento rispetto agli altri.

in questo modo modificando la posizione ed ordinando il risultato della query in modo crescente otterresti un menu in cui è possibile decidere la posizione in lista dell'elemento.

ex:

oggetto  posizione

home  - 1

downloads - 2

immagini - 3

poi premendo su un tasto si fa lo scambio in questo modo:

home - 1

immagini - 2 ( -1 )

downloads - 3 ( +1 )

basta fare una funzione che rimpiazza la posizione dell'elemento scelto e un'altra che sposta quella dell'elemento "coinvolto" nello spostamento alla posizione dell'elemento 1 :D piu facile a farsi che a dirsi!

ciao!

:bye:

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
modificato 9 anni fa
X 0 X
piu facile a farsi che a dirsi

.... per "mostri" del php come voi si .... ma per me che sono all'abc ... non è così.

Comunque, per iniziare mi creo nella tabella un campo INT (di che lunghezza e con quali proprietà?) ......

poi  che dati inserisco in questo nuovo campo ... intendo che valori ?

risposto 9 anni fa
ninext
X 0 X

dal primo messaggio mi è sembrato di capire che esiste già un campo della tabella di tipo INT che serve a memorizzare la posizione (l'ordince) dei record.

Quindi non dovresti cambiare nulla nella tabella ma semplicemente scambiare la posizione di due record in modo che quello di interessa salga o scenda.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Direi che un tinyint unsigned (da 0 a 255 )  potrebbe bastare se fosse un menù, ma dipende anche da quante righe sono.

Che valori? A te cosa serve? Il numero della posizione: 0,1,2,3,4,5,6 ecc.

Poi devi sempre controllare che quando sei a 0 (primo posto) non si possa andare oltre.

Rileggendo il tuo primo post, il campo con la posizione l'hai già è inutile che ne crei un'altro:

La posizione dei record l'ho memorizzata in un campo INT(11)

Il tipo INT può contenere oltre 4 miliardi di valori.

risposto 9 anni fa
LonelyWolf
X 0 X

quindi mi consigli di utilizzare il campo che ho già .... ma come gli dico di non andare in negativo???

risposto 9 anni fa
ninext
X 0 X

Basta un piccolo if prima di diminuirlo, una cosa tipo:

if (valore_Campo_da_diminuire > 0) {
valore_Campo_da_diminuire--;
valore_Campo_da_incrementare++;
//memorizzazione nel db dei dati aggiornati
}
else {
 //messaggio è già il primo
}

Però solo se unsigned, altrimenti può anche andare sotto zero ma non so come viene gestito da order by anche se dovrebbe gestirlo tranquillamente.

risposto 9 anni fa
LonelyWolf
modificato 9 anni fa
X 0 X

ma in realtà non c'è questo rischio perché uno spostamento di ordine è sempre uno scambio di posizioni.

Se ad esempio devi far salire un record allora lo dovrai scambiare con quello superiore. Se esiste un record a livello superiore allora non potranno uscire numeri negativi. Se non esiste invece significa che il record era già il primo e quindi non procedi con lo scambio. Chiaro?

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

E ma se l'utente sbaglia a cliccare invece di s"posta giù" a "sposta su"?

E' solo per quello che serve il controllo, oppure fa il controllo a priori (in fase di visualizzazione) e non fa comparire "sposta su" al primo.

risposto 9 anni fa
LonelyWolf
X 0 X

Fino a qui mi è tutto chiaro ... ma l'unico punto che mi è ancora da capire è come individuare il record da diminuire ... ipotizzando che decida di spostare in alto un determinato record ...

A esempio:

A - 1

B - 2

C - 3

Se voglio spostare in alto B ( lo trovo con una select e lo identifico con il suo id), come facio ad identificare A per poter effettuare l'update (con una select o altro??)

risposto 9 anni fa
ninext
X 0 X

A lo cerchi in base alla posizione di b -1:

esempio:

select * from tabella where id='B'; per trovare B

successivamente

select * from tabella where posizione = posizione_B-1; se devi spostare B sopra

select * from tabella where posizione = posizione_B+1; se devi spostare B sotto

anche le posizioni devono essere univoche.

risposto 9 anni fa
LonelyWolf
X 0 X

perché nessuno legge più i miei messaggi:  :tichedoff:

http://www.phpnews.it/forum/index.php?topic=1791.msg12005#msg12005

modificando la select che ho suggerito (in modo che restiuisca anche l'id del record cercato) non dovrebero esserci problemi.

:bye:

risposto 9 anni fa
Gianni Tomasicchio
modificato 9 anni fa
X 0 X

Ho iniziato ad impostare la select ... ma adesso datemi una mano ... perchè non so come implementarla con le 2 UPDATE ...

Il codice (generato da dreamweaver) della pagina è questa:

<?php require_once('../Connections/DB_Web_Biccari.php'); ?>
<?php 
/* Recupera i dati per eseguire l'update */
$idsez = $_GET['idsez'];
$ordvisez = $_GET['ordvisez'];
?>
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}

mysql_select_db($database_DB_Web_Biccari, $DB_Web_Biccari);
$query_rs_sezupdate = "SELECT id_sez, ordvis_sez FROM cms_sezioni WHERE id_sez = '$idsez' ORDER BY ordvis_sez DESC LIMIT 1";
$rs_sezupdate = mysql_query($query_rs_sezupdate, $DB_Web_Biccari) or die(mysql_error());
$row_rs_sezupdate = mysql_fetch_assoc($rs_sezupdate);
$totalRows_rs_sezupdate = mysql_num_rows($rs_sezupdate);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Documento senza titolo</title>
</head>

<body>
</body>
</html>
<?php
mysql_free_result($rs_sezupdate);
?>
risposto 9 anni fa
ninext
X 0 X

devi ancora ricavare l'id e la posizione del record da spostare. L'id dovresti rivcavarlo via $_GET e con questo, attraverso un'altra semplice SELECT, ricavare la sua posizione.

Alla fine devi avere: id (id1) e posizione (pos1) del record da spostare, id (id2) e posizione (pos2) del record che lo precede (o segue).

Poi fai così:

UPDATE nome_tabella SET posizione = pos2 WHERE id = id1

UPDATE nome_tabella SET posizione = pos1 WHERE id = id2

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

<?php

/* Recupera i dati per eseguire l'update */

$idsez = $_GET['idsez'];

$ordvisez = $_GET['ordvisez'];

?>

 .... ho recuperato così l'id e la posizione del record da spostare .... va bene??

Poi non so dove e come (sul codice che ho postato)  scrivere le 2 update ........ mi aiutat un po'???

Ste cose complicate ancora non riesco a farle ..... ho iniziato da poco col PHP e MySQL.

risposto 9 anni fa
ninext
X 0 X

 ... mi avete abbandonato????

risposto 9 anni fa
ninext
X 0 X
... mi avete abbandonato????

no ma non puoi pretendere che realizziamo tutto lo script per te...  :dunno:

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

.... no infatti non lo pretendo ... però un po di pietà per i novizi!!!

risposto 9 anni fa
ninext
X 0 X

Sto cercando di creare il codice seguendo i vostri consigli ma nel ricavare le posizioni dei dure record mi da questo errore:

Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource in C:\Inetpub\wwwroot\Comune_Biccari\BackOffice\cms_aree_move_process.php on line 18

Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource in C:\Inetpub\wwwroot\Comune_Biccari\BackOffice\cms_aree_move_process.php on line 23

Da cosa dipende??

Questo è il codice della pagina:

<?php require_once('../Connections/DB_Web_Biccari.php'); ?>
<?php 
/* Recupera i dati per eseguire l'update */
$idarea = $_GET['idarea'];
$ordarea = $_GET['posizarea'];
$direzione = $_GET['direzione'];
?>
<?php 

switch ($direzione)
 {

/* Se la direzione è su */
case 'giu':

$query1 = "SELECT * FROM cms_aree WHERE id_area = $idarea"; 
$result1 = mysql_query($query1);
$number1 = mysql_numrows($result1);


$query2 = "SELECT * FROM cms_aree WHERE ordvis_area = $ordarea+1"; 
$result2 = mysql_query($query2);
$number2 = mysql_numrows($result2);



break;


/* Se la direzione è giù */
case 'su':

echo ("Il valore di \$direzione è: $direzione");
break;

}
?>
risposto 9 anni fa
ninext
X 0 X

Quegli errori sono riferiti al fatto che le query non hanno dato risultato.

risposto 9 anni fa
LonelyWolf
X 0 X

Non capisco perchè ! .... o impostato male le query???? .... aiutatemi a capire!

risposto 9 anni fa
ninext
X 0 X

eseguile direttamente da phpmyadmin ad esempio e vedi se ti restituiscono qualche cosa.

risposto 9 anni fa
LonelyWolf
X 0 X

Le ho eseguite in SQLyog ... e mi ha restituto esattamente i record che mi aspettavo .....

C'è qualche altra cosa da controllare o qualche errore in altre parti del codice???

risposto 9 anni fa
ninext
X 0 X

le variabili sono valorizzate?

Prova a fare un echo delle query, così verifichi che siano "formate" correttamente.

risposto 9 anni fa
LonelyWolf
X 0 X

Ho risolto .... erano i dati di connessone al db nel file incluso ad inizio pagina!

risposto 9 anni fa
ninext
X 0 X

Sto vedendo che non mi aggiorna la posizione con la prima UPDATE .....

Posto il codice:

<?php 
/* Recupera i dati per eseguire l'update */
$idarea = $_GET['idarea'];
$ordarea = $_GET['posizarea'];
$direzione = $_GET['direzione'];
?>

/* Se la direzione è su */
case 'giu':

/* Identifico il record da spostare in basso  */
$query1 = "SELECT * FROM cms_aree WHERE id_area = $idarea"; 
$result1 = mysql_query($query1);
$number1 = mysql_numrows($result1);

/* Identifico il record da spostare in alto  */
$query2 = "SELECT * FROM cms_aree WHERE ordvis_area = $ordarea+1"; 
$result2 = mysql_query($query2);
$number2 = mysql_numrows($result2);


/* Aggiorno la posizione  del record daspostare in basso */
$query3 = "UPDATE cms_aree SET ordvis_area = $ordarea-1 WHERE id_area = $idarea";
?>
risposto 9 anni fa
ninext
modificato 9 anni fa
X 0 X

Mi sta cominciando a funzionare ... ma ho un  problemino: lo spostamento in alto non mi funziona ... o meglio

mi diminuisce solo la posizione di quello da far scendere ma mi mantiente invariata quella del record che intendo far salire.

Poi comunque mi restituisce questo errore:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\Inetpub\wwwroot\sito1\BackOffice\cms_aree_move_process.php on line 60

Da cosa dipende???

 Vi prego datemi una mano ....

<?php 
/* Recupera i dati per eseguire l'update */
$idarea = $_GET['idarea'];
$ordarea = $_GET['posizarea'];
$direzione = $_GET['direzione'];
?>

switch ($direzione)
 {

/* ------------------- Se la direzione è giu ------------------- */
case 'giu':

/* Identifico il record da spostare in basso  */
$query1 = "SELECT * FROM cms_aree WHERE id_area = $idarea"; 
$result1 = mysql_query($query1);
$number1 = mysql_num_rows($result1);

/* Identifico il record da spostare in alto  */
$query2 = "SELECT * FROM cms_aree WHERE ordvis_area = $ordarea+1"; 
$result2 = mysql_query($query2);
$number2 = mysql_num_rows($result2);

/* Definisco l'id del record da spostare in alto  */
$record = mysql_fetch_array($result2);
$idarea2 = $record['id_area'];

/* Aggiorno la posizione  del record daspostare in basso */
$query3 = "UPDATE cms_aree SET ordvis_area = ordvis_area+1 WHERE id_area = $idarea";
$result3 = mysql_query($query3);

/* Aggiorno la posizione  del record daspostare in alto */
$query4 = "UPDATE cms_aree SET ordvis_area = ordvis_area-1 WHERE id_area = $idarea2";
$result4 = mysql_query($query4);

/* Ridireziona il browser al sito di PHP  */
header("Location: Copia%20di%20cms_aree_edit_del.php"); 

break;



/* ------------------ Se la direzione è su ----------------- */
case 'su':

/* Identifico il record da spostare in alto  */
$query5 = "SELECT * FROM cms_aree WHERE id_area = $idarea"; 
$result5 = mysql_query($query5);
$number5 = mysql_num_rows($result5);

/* Identifico il record da spostare in basso  */
$query6 = "SELECT * FROM cms_aree WHERE ordvis_area = $ordarea-1"; 
$result6 = mysql_query($query6);
$number6 = mysql_num_rows($result6);

/* Definisco l'id del record da spostare in basso  */
$record2 = mysql_fetch_array($result6);
$idarea3 = $record2['id_area'];

/* Aggiorno la posizione del record daspostare in alto */
$query7 = "UPDATE cms_aree SET ordvis_area = ordvis_area-1 WHERE id_area = $idarea";
$result7 = mysql_query($query7);

/* Aggiorno la posizione  del record daspostare in basso */
$query8 = "UPDATE cms_aree SET ordvis_area = ordvis_area+1 WHERE id_area = $idarea3";
$result8 = mysql_query($query8);


break;

}


?>
risposto 9 anni fa
ninext
modificato 9 anni fa
X 0 X

quel tipo di errore viene generato quando la query che lo precede è fallita

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

... si infatti è fallita, ma parzialmente perchè lo spostamento in basso del record da far scendere di posizione me lo fa!

In pratica non mi fa salire quello che ho deciso di far salire ...... dov'è l'errore????

risposto 9 anni fa
ninext
X 0 X

una query non può fallire parzialmente... o va o non va.

Comunque devi scambiare le posizioni tra le righe, non devi semplicemente incrementare o decrementarle!!!

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

... so di chiedere troppo ... ma puoi dirmi concretamente come correggere la parte di codice che non va???

Lo spostamento in basso mi funziona e non mi da errori!

risposto 9 anni fa
ninext
X 0 X

mi dispiace ma non ho il tempo per fare il lavoro al posto tuo  :dunno:

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda