Problema con estrapolazione dati db

Riciao a tutti!

Io ho un form chiamato "conferma" dove vengono inseriti l ID ed il nome, e la pagina "elabora_conferma" che memorizza i dati della form, estrapola il record  del id memorizzato dal form di una tabella, e confronta se il campo nome è identico, cè un problema ma non sò cosa sia metto qui i codici

CONFERMA.htm

<form action="elabora_conferma.php" method="post">
<td><i><u><b>inserisci qui il tuo ID</i></u></b>
</td>
<td>
<input type="text" name="id">
</td>
</td>
</tr>
<tr>
<td width="20%"><b><i><u>Inserisci qui il tuo nome</b></i></u>
</td>
<td>
<input type="text" name="id">
</td>
</tr>
<tr>
<tr>
<td><b><i><u>Conferma</b></i></u>
</td>
<td>
<input type="submit" value="Clicca qui">&nbsp&nbsp&nbsp
</td>
</tr>
</table>

ELABORA_CONFERMA.PHP

<?php
$connessione = mysql_connect("localhost", "root", "elettronica");
$selezione_db = mysql_select_db("esperimento", $connessione);
$id = htmlspecialchars($_POST['id']);
$nom = htmlspecialchars($_POST['nome']);
$lettura=mysql_query("select* from annunci where id = '$id' ");
  while($scatola=mysql_fetch_array($lettura)){
     $nome = $scatola[nome];
   }
    if($nom == $nome)
    {
    echo "tutto a posto";
    }
      else {
      echo "cè qualcosa che non và";
   }
   ?>

Grazie!!

 

inviato 7 anni fa
gianluca80
X 0 X

rileggendolo ho visto che mi sono spiegato malissimo......io non riesco a fare il confronto,  nel form di CONFERMA.html sia se metto un nome corrispondenete al id o ne metto uno diverso mi dice sempre che il nome non è uguale

risposto 7 anni fa
gianluca80
X 0 X

Fai la query sull'id...non sul nome...

Inoltre l'asterisco va staccato dal select...

Non ho ben capito che problema hai però...

risposto 7 anni fa
Mario Santagiuliana
X 0 X

ti commento le righe di programmazione così è chiaro

<?php
$connessione = mysql_connect("localhost", "root", "elettronica");
$selezione_db = mysql_select_db("esperimento", $connessione);
$id = htmlspecialchars($_POST['id']);// trasformo l id che l utente ha scritto nel form 
$nom = htmlspecialchars($_POST['nome']);//trasformo il nome che l utente ha scritto nel form
$lettura=mysql_query("select* from annunci where id = '$id' ");//estraggo dalla tabella il record che corrisponde al id scritto dall utente
  while($scatola=mysql_fetch_array($lettura)){
     $nome = $scatola[nome]; estraggo dal record l informazione "nome"
   }
    if($nom == $nome)//confronto il nome scritto dal utente nel form con il nome estratto
    {
    echo "id corrispondente";//se il nome scritto dal utente è uguale al nome che ce nel record del id dato dal utente
    }
      else {
      echo "id non corrispondente";se il nome è diverso al nome del record dell id dato dall utente
   }
   ?>

In pratica sarebbe un form di conferma, in una pagina vengono inseriti dei dati, caricati in una tabella, poi viene spedita via emeil all utente l id corrispondente al record creato, nel emeil cè url per il form CONFERMA.HTM, l utente inserisce l id e reinserisce il suo nome, quando invia se il suo nome corrisponde al nome che ce sul record vorrei far cambiare un valore boleano in una casella sempre presente nello stesso record.

Il problema è che sia se metto il nome giusto che quello sbagliato mi dice sempre "id non corrispondente"

risposto 7 anni fa
gianluca80
X 0 X

Secondo me ti conviene lasciare perdere il ciclo while, fai tutto con una query, alla fine l'id è univoco no?

Prova così:

$lettura=mysql_query("SELECT * FROM annunci WHERE id = '$id' AND nome = '$nom'");
if(mysq_result($lettura,0))
  //l'utente è presente e fai quello che ti serve

Insomma una cosa semplice.

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Grazie MarioS ora ci provo!

risposto 7 anni fa
gianluca80
X 0 X

Ho provato il codice è questo

<?php
$connessione = mysql_connect("localhost", "root", "elettronica");
$selezione_db = mysql_select_db("esperimento", $connessione);
$id = htmlspecialchars($_POST['id']);
$nom = htmlspecialchars($_POST['nome']);
$lettura=mysql_query("SELECT * FROM annunci WHERE id = '$id' AND nome = '$nom'");
if(mysql_result($lettura,0)) //l'utente è presente e fai quello che ti serve
    {
    echo "tutto a posto";
    }
      else {
      echo "cè qualcosa che non và";
   }
   ?>

ma mi da questo messaggio di errore:

Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 3 in C:\Apache Software Foundation\Apache2.2\htdocs\annunciamonline\elabora_conferma.php on line 7

cè qualcosa che non và

risposto 7 anni fa
gianluca80
X 0 X

Prova con:

if ( mysql_result ( $lettura, 0, 0 ) != 0 )

Inserisci un controllo se è stato inviato un array $_POST prima di procedere con il tutto.

Ciao

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Ciao Gianluca80, hai provato a controllare meglio il codice HTML che genera il form?

Da quanto ho potuto vedere utilizzi il nome id per due campi del form, in questo modo il valore inserito nel secondo campo sovrascrive quello presente nel primo

Prova ad utlizzare questo snippet di HTML per il form

<form action="form_conferma.php" method="post">
  <p>
    <input type="text" name="id" value="" /> Id
  </p>
  <p>
    <input type="text" name="nome" value="Nome" /> Nome
  </p>
</form>
<?php
$connessione = mysql_connect("localhost", "root", "elettronica");
if (mysql_select_db("esperimento", $connessione)) {
  die("Errore di selezione del database");
}
// Mi accerto che l'id sia un intero
$id = intval($_POST['id']);
$nome = htmlspecialchars($_POST['nome']);
$lettura = mysql_query("SELECT * FROM annunci WHERE id = $id AND nome = '$nome' LIMIT 1");

$utente = mysql_result($lettura, 0);

if ($utente) {
  echo "Okay";
} else {
  die("Utente non trovato: " . mysql_error());
}

:bye:

risposto 7 anni fa
Andrea Turso
Andrea Turso
86
modificato 7 anni fa
X 0 X

Grazie ho provato ma mi dice che non è connesso al database....ho controllato ma non ci sono errori....invece se uso lo script cosi

<?php
$connessione = mysql_connect("localhost", "root", "elettronica");
$selezione_db = mysql_select_db("esperimento", $connessione);
// Mi accerto che l'id sia un intero
$id = intval($_POST['id']);
$nome = htmlspecialchars($_POST['nome']);
$lettura = mysql_query("SELECT * FROM annunci WHERE id = $id AND nome = '$nome' LIMIT 1");

$utente = mysql_result($lettura, 0);

if ($utente) {
  echo "Okay";
} else {
  die("Utente non trovato: " . mysql_error());
}
?>

Mi da questo errore:

Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 3 in C:\Apache Software Foundation\Apache2.2\htdocs\annunciamonline\elabora_conferma.php on line 9

Utente non trovato:

risposto 7 anni fa
gianluca80
modificato 7 anni fa
X 0 X

Mhh, potrei aver commesso qualche errore nella scrittura del codice; l'ho fatto durante la pausa al Politecnico.

Ora cerco di fare un paio di prove in locale per correggere gli errori ed assicurarmi che funzioni.

Comunque se riguardi il codice HTML che hai postato insieme al primo messaggio puoi notare che tutti e due i campi hanno l'attributo name="id" per cui in $nome è una variabile indefinita perché viene popolata da $_POST['nome'] che non esiste.

:bye:

risposto 7 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

In effetti c'erano un paio di orrori. È da molto che non metto le mani in pasta con le funzioni native per l'interrogazione del database.

Comunque il blocco di codice corretto è questo, provato e funzionante.

<?php

// Connessione al database, io ho usato un array per connettermi al mio database
// chiaramente tu dovresti riscrivere i tuoi dati manualmente :)
$connessione = mysql_connect($db['server'], $db['user'], $db['password']);
if (!mysql_select_db($db['database'])) {
  die("Errore di selezione del database");
}

// Convertiamo l'ID proveniente dal form in un intero
$id = intval($_POST['id']);

// Qui validerei meglio!
$nome = htmlspecialchars($_POST['nome']);

// Estraggo l'id dell'utente che ha ID e NOME corrispondenti ai dati provenienti dal form
// Prima di eseguire la query modifichiamo il nome in modo da essere sicuri che il confronto
// venga fatto tra stringhe in minuscolo.
$lettura = mysql_query("SELECT id FROM annunci WHERE id = $id AND LOWER(nome) = LOWER('$nome') LIMIT 1");

// Controlliamo che la query sia andata a buon fine
if (!$lettura) {
  // Oops. Mostriamo un messaggio di errore
  die("Impossibile estrarre utente");
} else {
  // Okay, estreiamo l'ID dell'utente dal Result Set che ci ritorna MySQL
  $utente = mysql_result($lettura, 0, 0);

  // È possibile che la query sia andata a buon fine ma che ci fornisca
  // un Result Set vuoto... Controlliamo che non lo sia.
  if ($utente) {
    echo "Utente Trovato"
  } else {
    die("Utente non trovato <$id, $nome>");
  }
}

:bye:

risposto 7 anni fa
Andrea Turso
Andrea Turso
86
modificato 7 anni fa
X 0 X

Rigrazie....ma ritorna lo stesso errore, scusa se sembro svogliato ma io non sò dove sbattere la testa....uso php versione 5.2.10

 :bye:

risposto 7 anni fa
gianluca80
X 0 X

Sicuro che ci siano record nella tabella? È possibile che mysql_result fallisca perché cerca di spostarsi un result set vuoto. L'unico metodo sarebbe quello di sopprimere gli errori usando il silence operator @. Cosa che comunque ti sconsiglio di fare.

Prova a vedere se ci sono record, perché dovrebbe funzionare senza alcun problema. Se sono presenti dei record e il problema persiste ancora investigheremo più a fondo le cause.

:bye:

risposto 7 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Ci sono 25 record la tabella è composta da 10 colonne per record

risposto 7 anni fa
gianluca80
X 0 X

Io ho lavorato con una tabella ad-hoc per la query. Magari prova a postare il codice sql per creare la tua così posso provare ancora. Tuttavia mi sembra bizzarro che mysql_result non riesca a spostarsi nel record set.

Prova a inserire:

<?php
var_dump($lettura, $id, $nome);

subito dopo la riga in cui viene definita la variabile $lettura. È possibile che non esista alcun record che rispetti la condizione di selezione, il che spiegherebbe un record set vuoto.

Assicurati che:

  • gli indici dell'array $_POST corrispondando ai nomi dei campi del form HTML
  • variabili $_POST['nome'] e $_POST['id'] (quindi anche $nome e $id) siano valorizzate in modo atteso.
  • i campi del form non abbiano lo stesso nome
  • esistano dei record che soddisfano la condizione di selezione

Permettimi una domanda: come mai utilizzi una ricerca per id e nome? L'id è una condizione sufficiente per identificare precisamente un record. Al momento mi sfugge il motivo di tale decisione, o forse non l'hai specificato affatto. Fammi sapere.

:bye:

risposto 7 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Te lo faccio sapere subito, io ho una pagina dove  l utente inserisce dei dati: Titolo, annuncio, nome, provincia, cerco_offro, categoria, emeil e un altra colonna chiamata conferma settata a zero.

una volta inviati i dati viene mandato all utente un emeil con il suo nome, la sua provincia e l id creato dall inserimento del record.

L' utente và sul link dove dovrebbe esserci questa pagina chiamata conferma.html, inserire i tre dati richiesti schiacciare invio e farmi cambiare il dato presente nella colonna CONFERMA settata a 0 cambiarla ad uno, per lo meno questa è la mia idea!

risposto 7 anni fa
gianluca80
X 0 X

lo svolgimento sella programmazione è giusto??

risposto 7 anni fa
gianluca80
X 0 X

Mhh, praticamente vuoi che l'annuncio dell'utente sia attivato con una conferma via email, giusto?

In tal caso il procedimento che stai seguendo non è esattamente il migliore in quanto portare all'esterno un riferimento che usa la tua applicazione per gestire gli annunci potrebbe rappresentare un problema di sicurezza, oltre che essere una soluzione poco elegante.

Un approccio migliore potrebbe essere questo:

Quando un utente inserisce un annuncio memorizzi un token casuale insieme ad esso

<?php
// omissis
$token = md5(microtime() + rand());

// omissis
$query = "INSERT INTO annunci ([...], token, confermato) values ([...], $token, 0)";
$esito = mysql_query($query);

Insomma qualcosa che possa essere mostrato all'esterno senza far "dare un'occhiata" a come funziona la tua applicazione all'utente.

Successivamente invii l'email contenente l'indirizzo dello script che valida l'annuncio:

Conferma il tuo annuncio cliccando sul link seguente:

http://example.com/valida.php?token=<qui c'è il token>

Cordiali saluti,
John Doe

Ed ecco un esempio di script per la validazione:

<?php
// omissis
$token = $_GET['token'];
$query = "UPDATE annunci SET confermato = 1, token = null WHERE token = '$token'";
$esito = mysql_query($query);
// omissis

Praticamente in questo modo ti assicuri che solo chi ha inviato l'annuncio possa inviare una richiesta di validazione (attraverso l'attivazione del link che gli hai inviato via email) per un annuncio. Se avessi utilizzato come riferimento l'id dell'annuncio chiunque avesse ricevuto l'email avrebbe potuto giocare a validare gli altri annunci incrementando o riducendo l'id dell'annuncio da validare nell'url. Non credi?

Chiaramente questa è un semplice esempio ridotto all'osso per ragioni di semplicità, ma se hai compreso il concetto puoi implementarlo insieme ad un adeguato livello di validazione dell'input (prima di passare il token dell'url alla query!) oppure aggiungendo un lasso di tempo entro il quale sarà bloccata l'attivazione dell'annuncio.

:bye:

risposto 7 anni fa
Andrea Turso
Andrea Turso
86
modificato 7 anni fa
X 0 X

Ok grazie! è che io non sono esperto quindi avevo optato per la soluzione.....piu semplice...ma la tua è molto migliore!  ;D ora la studio e cerco di applicarla poi ti farò sapere grazie! O0

 :bye:

risposto 7 anni fa
gianluca80
X 0 X

Scusa Trashofmaster ma non riesco a capirlo io ho provato a fare cosi:

TEST.HTM

<html>
<form action="test.php" method ="post">
<select name="sesso">
<option value="maschio"> Maschio
<option value="femmina"> Femmina
</select>
<br><br>
<select name="eta">
<option value="0">0
<option value="10">10
<otpion value="20">20
<option value="30">30
</select>
<br><br>
<input type="submit" value="Vai!!"> 
</form>
</html>

TEST.PHP

<?php
$sesso = htmlspecialchars($_POST['sesso']);
$eta = htmlspecialchars ($_POST['eta']);
$token = md5(microtime() + rand());
$connessione = mysql_connect("localhost", "root", "elettronica");
$selezione_db = mysql_select_db("esperimento", $connessione);
$query = "INSERT INTO test (nome, eta, token, confermato) values (\"nome\", \"eta\", \"$token\", \"0\")";
$esito = mysql_query($query);
echo ciao;
?>

Ho fatto un tabella così

nome                 varchar(20)
eta                     int(100)
token                varchar(100)
confermato        int(4)
risposto 7 anni fa
gianluca80
modificato 7 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

ho sbagliato il codice php.....

<html>
<?php
$sesso = htmlspecialchars($_POST['sesso']);
$eta = htmlspecialchars ($_POST['eta']);
$token = md5(microtime() + rand());
$connessione = mysql_connect("localhost", "root", "elettronica");
$selezione_db = mysql_select_db("esperimento", $connessione);
$query = "INSERT INTO test (nome, eta, token, confermato) values (\"$nome\", \"$eta\", \"$token\", \"0\")";
$esito = mysql_query($query);
echo ciao;
?>
</html>
risposto 7 anni fa
gianluca80
X 0 X

Ma non va comunque

risposto 7 anni fa
gianluca80
X 0 X

Ma la tabella non era quella annunci?

Se il problema è diverso dovresti aprire un altro thread.

Comunque non riesco a capire cosa vuoi fare, ora cerco di scrivere tutto il codice necessario per

  • inserire i dati dell'anncuncio nel database, insieme al token
  • mostrare il messaggio da inviare via email
  • validare l'annuncio utilizando il token

:bye:

risposto 7 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

si scusami ho fatto una pagina di test...ma è sempre la stessa cosa...

risposto 7 anni fa
gianluca80
X 0 X

grazie!

risposto 7 anni fa
gianluca80
X 0 X

Allora, ecco qui l'esempio

Codice SQL per la creazione della tabella

CREATE TABLE `annunci` (
  `id` int(11) NOT NULL auto_increment,
  `nome` varchar(60) default NULL,
  `token` varchar(32) default NULL,
  `confermato` tinyint(1) default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM;

Codice PHP per la validazione del form (valida_form.php).

Anziché inviare via email il messaggio con il link da cliccare lo visualizzo

direttamente sullo schermo.

<?php
// omissis ... connessione al database & co.

// Generazione del token
$token = md5(microtime() + rand() * rand());


$testoEmail = <<<EMAIL
  Ciao Utente,
  il tuo annuncio è stato inserito nel sistema ma deve essere confermato.

  Per confermarlo fai click sul link sottostante:
  http://example.com/valida_annuncio.php?token=$token
EMAIL;

$query = "INSERT INTO annunci (id, nome, token) VALUES (null, 'Annuncio', '$token')";
$esito = mysql_query($query);

if ($esito) {
  echo $testoEmail;
} else {
  die('Errore inserimento annuncio');
}

Codice PHP per la conferma dell'annuncio utilizzando il token (valida_annuncio.php)

<?php
// omissis ... connessione al database & co.

$token = $_GET['token'];

$query = "UPDATE annunci SET confermato=1, token=null WHERE token='$token' LIMIT 1";
$esito = mysql_query($query);

// Verifico che il mio record sia stato effettivamente aggiornato!
if (mysql_affected_rows()) {
  echo 'Il tuo annuncio è stato abilitato';
} else {
  die('Errore identificazione annuncio annuncio. Token non valido');
}

Ora partendo dal codice che ti ho postato come esempio cerca di applicare la soluzione al tuo problema.

 :bye:

risposto 7 anni fa
Andrea Turso
Andrea Turso
86
modificato 7 anni fa
X 0 X

Ciao! grazie! Ho modificato un attimino il codice per creare la tabella, probabilmente abbiamo 2 versioni di sql diverse...ora proverò ad integrarlo nel codice, ci metterò un po di tempo però, e poi ti dirò come è andata!

 :bye: :bye:

risposto 7 anni fa
gianluca80
X 0 X

è andata benissimo! grazie trashofmaster!

risposto 7 anni fa
gianluca80
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda