Select in baza de date dupa valoare dintr-un input

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
Liaf
Mesaje: 36

Select in baza de date dupa valoare dintr-un input

Salutare.
Sunt nou in domeniul php si am sa va rog sa aveti rabdare cu mine.
Folosind https://marplo.net/php-mysql/php-mys ... ysqli.html am reusit sa setez un php care sa faca conectarea la o baza de date dorita de mine.

Nu stiu insa cum sa fac un fisier php care sa ceara de la user numele pe care doreste sa il caute in baza de date si apoi sa afiseze rezultatele (inclusiv restul campurilor asociate acelui nume - adica parola asociata acelui nume si id-ul numelui cautat).

As dori ca dupa accesarea numelui care va fi de forma unui link conexiunea la baza de date sa se inchida - sa nu ramana astfel foarte multe conexiune legata la baza de date ptr a pica webhostul.

MarPlo Mesaje: 4343
Salut
Poti crea un formular cu un camp text in care sa fie adaugat numele.
In codul php preiei valoarea din acel camp text si faci select cu el.

Cod: Selectaţi tot

<?php
if(isset($_POST['nume'])) {
  $conn = new mysqli('localhost', 'root', '', 'tests');
  $nume = $_POST['nume'];
  $sql = "SELECT * FROM tabel WHERE nume = ". $conn->real_escape_string($nume);
  // restul codului, executa interogarea, preia si afiseaza datele
}
?>
<form action="file.php" method="post">
<input type="text" name="nume" id="nume" size="50" />
<input type="submit" value="Send" />
</form>
- Mai vezi in lectiile de pe site cum se lucreaza cu date din formular in php, cu GET si POST; si cum se parcurg datele dintr-un Select in mysql, cu foreach(). Si poti reveni cu intrebari unde nu te descurci dupa ce mai studiezi si alte lectii /tutorialele.

Liaf Mesaje: 36
Srry de double post dar nu mai pot edita :

Cod: Selectaţi tot

<?php
if(isset($_POST['nume'])) {
  $conn = new mysqli('localhost', 'DB NAME', 'DB USER', 'PASS');
  $nume = $_POST['nume'];
  $sql = "SELECT * FROM TABELUL_DIN_DB WHERE nume = ". $conn->real_escape_string($nume);
  // restul codului, executa interogarea, preia si afiseaza datele
}
?>
Am modificat asa si imi da urmatoarele erori:
Warning: mysqli::mysqli(): (28000/1045): Access denied for user 'rmxrsn47_watch'@'localhost' (using password: YES) in /home/rmxrsn47/public_html/website/searchandwatch.php on line 3

Warning: mysqli::real_escape_string(): Couldn't fetch mysqli in /home/rmxrsn47/public_html/website/searchandwatch.php on line 5

MarPlo Mesaje: 4343
E gresita ordinea valorilor in functia de conectare cu mysqli.
Formula e asa:

Cod: Selectaţi tot

$conn = new mysqli('localhost', 'utilizator', 'parola', 'baza_date'); 

Liaf Mesaje: 36
Am incercat si asa

Cod: Selectaţi tot

<?php
if(isset($_POST['nume'])) {
  $conn = new mysqli('localhost', 'rmxrsn47_watch', 'PAROLA', 'rmxrsn47_watch');
  $nume = $_POST['nume'];
  $sql = "SELECT * FROM watch WHERE nume = ". $conn->real_escape_string($nume);
  // restul codului, executa interogarea, preia si afiseaza datele
}
?>
<form action="searchandwatch.php" method="post">
<input type="text" name="nume" id="nume" size="50" />
<input type="submit" value="Send" />
</form>
Unde numele de utilizator si baza de date sunt aceleasi pentru ca asa le-am creat, iar fisierul file.php la mine se numeste searchandwatch.php. De asemenea in baza de date exista un singur tabel (tabelul watch) in care sunt doua intrari numite sugestiv proba.

Cand accesez searchandwatch.php imi apare campul si butonul send. Scriu proba insa nu se intampla nimic, doar ca revine la pagina searchandwatch.php si imi arata pagina goala fara absolut nimic.
Acelasi lucru se intampla si daca pun <form></form> intr-un html separat de partea php.

MarPlo Mesaje: 4343
Unde este acest comentariu in cod, ai adaugat ceva?

Cod: Selectaţi tot

// restul codului, executa interogarea, preia si afiseaza datele
Daca nu, atunci e normal sa nu afiseze ceva fiindca nu ai dat sa afiseze (cu echo sau print).
Uite in lectia de la pagina: https://marplo.net/php-mysql/php-mys ... er-by.html cum se parcurg si se afiseaza datele dintr-o Interogare Select. Si mai poti vedea si prin celelalte lectii /tutoriale, daca vrei sa inveti.

Liaf Mesaje: 36
Am urmat ceea ce am inteles eu in acel tutorial prezentat si am ajuns la acest searchandwatch.php

Cod: Selectaţi tot

<?php
if(isset($_POST['nume'])) {
  $conn = new mysqli('localhost', 'rmxrsn47_watch', 'PASS', 'rmxrsn47_watch');
  $nume = $_POST['nume'];
  $sql = "SELECT * FROM watch WHERE nume = ". $conn->real_escape_string($nume);

// executa interogarea si retine datele returnate
$result = $conn->query($sql);

// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
  // afiseaza datele din fiecare rand din $result
  while($row = $result->fetch_assoc()) {
    echo '<br /> nume: '. $row['nume']. ' - an: '. $row['an']. ' - gen: '. $row['gen']. ' - link: '. $row['link'];
  }
}
else {
  echo '0 rezultate';
  }
}
$conn->close();
?>
Pagina html ce contine:

Cod: Selectaţi tot

<form action="searchandwatch.php" method="post">
<input type="text" name="nume" id="nume" size="50" />
<input type="submit" value="Send" />
</form>
Atunci cand scriu in campul de cautare din pagina html "proba" si dau search php-ul imi da ca raspuns 0 rezultate desi eu am creat in tabelul watch din baza de date 2 linii numite proba.
Daca accesez direct pagina php imi da urmatoarea eroare:

Cod: Selectaţi tot

Fatal error: Call to a member function close() on a non-object in /home/rmxrsn47/public_html/website/searchandwatch.php on line 22

MarPlo Mesaje: 4343
Eroarea apare fiindca "$conn = ..." e in cadrul lui if(), iar $conn->close(); e adaugat in afara conditiei acelui if() care verifica daca sunt date trimise din formular.
Ar trebui asa:

Cod: Selectaţi tot

<?php
if(isset($_POST['nume'])) {
  $conn = new mysqli('localhost', 'rmxrsn47_watch', 'PASS', 'rmxrsn47_watch');
  // ...

  // daca $result contine cel putin un rand
  if ($result->num_rows > 0) {
    // ...
  }
  else {
    echo '0 rezultate';
  }

  $conn->close();
}
?>
In rest, nu stiu ce coloane si randuri cu date ai in baza de date.

Liaf Mesaje: 36
Mersi foarte mult de ajutor. Vreau sa stii ca apreciez foarte mult faptul ca iti dedici timp din viata ta pentru niste necunoscuti.

Am facut exact asa cum spui tu.
Baza de date arata in felul urmator : s16.postimg.org/oq4kgv1ad/baza_1.png
Tabelul watch din baza de date arata in felul urmator: postimg.org/image/sht0re8p3/

Php-ul meu final arata in felul urmator:

Cod: Selectaţi tot

<?php
if(isset($_POST['nume'])) {
  $conn = new mysqli('localhost', 'rmxrsn47_watch', 'PROBA', 'rmxrsn47_watch');
  $nume = $_POST['nume'];
  $sql = "SELECT * FROM watch WHERE nume = ". $conn->real_escape_string($nume);

// executa interogarea si retine datele returnate
$result = $conn->query($sql);

// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
  // afiseaza datele din fiecare rand din $result
  while($row = $result->fetch_assoc()) {
    echo '<br /> nume: '. $row['nume']. ' - an: '. $row['an']. ' - gen: '. $row['gen']. ' - link: '. $row['link'];
  }
}
  else {
    echo '0 rezultate';
  }

  $conn->close();
}
?>
Acum cand fac cautare dupa proba (sau orice alt cuvant) imi spune 0 rezultate desi in tabel se vede ca am 2 linii numite sugestiv proba.
Daca caut nume atunci rezultatul care se deschide in php este exact acesta:

Cod: Selectaţi tot

nume: - an: - gen: - link: 
nume: - an: - gen: - link:
Nu vad ce este gresit de orice caut nu imi intoarce nici un rezultat insa pentru nume imi intoarce 2 linii total aiurea.

MarPlo Mesaje: 4343
1. Coloana "Nume" fiind de tip sir (string), valoarea pentru ea trebuie transmisa intre ghilimele.
Adica asa (aici am gresit eu cand am scris codul mai sus):

Cod: Selectaţi tot

$sql = "SELECT * FROM nume_tabel WHERE nume = '". $conn->real_escape_string($nume) ."'"; 
2. In tabel ai scris numele coloanelor cu litera mare la inceput (Nume, An, ...), dar in php ai cu litera mica tot cuvantul ($row['nume']). Ar trebui sa fie la fel, cel mai bine sa folosesti doar cu litere mici si la numele din mysql (nume, an, gen, link).
- Codul functional va fi asa:

Cod: Selectaţi tot

<?php
if(isset($_POST['nume'])) {
  $conn = new mysqli('localhost', 'rmxrsn47_watch', 'PROBA', 'rmxrsn47_watch');
  $nume = $_POST['nume'];
  $sql = "SELECT * FROM watch WHERE nume = '". $conn->real_escape_string($nume) ."'";

  // executa interogarea si retine datele returnate
  $result = $conn->query($sql);

  // daca este eroare de mysql, intrerupe codul si arata eroarea
  if(!$result) {
    exit('Eroare mysql: '. $conn->error);
  }

  // daca $result contine cel putin un rand
  if ($result->num_rows > 0) {
    // afiseaza datele din fiecare rand din $result
    while($row = $result->fetch_assoc()) {
      echo '<br /> nume: '. $row['Nume']. ' - an: '. $row['an']. ' - gen: '. $row['gen']. ' - link: '. $row['link'];
    }
  }
  else {
    echo '0 rezultate';
  }

  $conn->close();
}
?>

Liaf Mesaje: 36
Merge acum de minune. Datele sunt afisate corect insa am tot cautat pe site si nu am gasit cum pot afisa datele pe care mi le da php-ul intr-o pagina html astfel incat sa se pastreze tematica site-ului.
- Exista un astfel de tutorial aici ?

Si inca ceva. De ce forma ar trb sa fie o coloana astfel incat la cautare daca nu este intregul nume din coloana si doar o parte scrisa sa se afiseze si linia in cauza din coloana ?

MarPlo Mesaje: 4343
In fisierul php poti adauga cod php, astfel adaugi datele de la php intre tag-uri html. Dar despre asta poate ar trebui sa deschizi un alt subiect, cu ce ai incercat sa faci si unde nu te descurci, caci nu are legatura cu acesta.

Tipul coloanei se pune in functie de tipul de date care vrei sa fie in ea: VARCHAR pt text, INT pt numere intregi, DATETIME pt data si ora. Mai sunt si altele, le gasesti in primele lectii despre MySQLi.
Daca vrei sa faci cautare in coloana dupa un text partial, vezi explicatiile si script-ul de la tutorialul: Cautare in tabel MySQL.

Subiecte similare