Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Jak znaleźć wiersz w tabeli Mysql
Forum PHP.pl > Forum > Przedszkole
muumiin
Potrzebuję znaleźć w tabeli pages wiersz, którego wartość name=$entered i wczytać zawartość tego wiersza do jakiejś tablicy.
Randallmaster
Zapytanie:

  1. SELECT * FROM pages WHERE name=$entered


Potrzebować będziesz takie komendy:
mysql_query
mysql_fetch_array

PS. oczywiście musisz mieć połączenie z bazą danych
ilidir
  1. mysql_connect('localhost', 'uzytkownik', 'haslo') or
  2. die('Nie można się połączyć: ' . mysql_error());
  3. mysql_select_db('baza');
  4.  
  5. $zmienna = SELECT * FROM pages WHERE name=$entered
  6.  
  7. $sql = mysql_query($zmienna);
  8. while ($tabela = mysql_fetch_array($sql, MYSQL_NUM)) {
  9. printf (tabela[0], tabela[1]);
  10. }


coś takiego może ci pomoże
grzes999
Cytat(ilidir @ 5.11.2014, 14:22:56 ) *
  1. mysql_connect('localhost', 'uzytkownik', 'haslo') or
  2. die('Nie można się połączyć: ' . mysql_error());
  3. mysql_select_db('baza');
  4.  
  5. $zmienna = SELECT * FROM pages WHERE name=$entered
  6.  
  7. $sql = mysql_query($zmienna);
  8. while ($tabela = mysql_fetch_array($sql, MYSQL_NUM)) {
  9. printf (tabela[0], tabela[1]);
  10. }


coś takiego może ci pomoże


Wszystkie funckje z mysql chyba uważane są już za przestażałem i powinno stosować się mysqli. Ale wszystko inne to tak jak kolega napisał powinno działać.
muumiin
wolałabym nie używać przestarzałych metod

http://php.net/manual/en/function.mysql-query.php


Piszę CMS-a i zależy mi na solidnie napisanym kodzie, z którego będę mogła w przyszłości korzystać.

Z bazą danych łączę się za pomocą biblioteki PDO
aniolekx
Tyle osób na forum pisze własnego CMSa ze możne powinniśmy napisać wspólnego wink.gif ?

A wracając do twojego pytania zamiast się męczyć z czystym sql'em możesz użyć czegoś takiego: Medoo
muumiin
chętnie wink.gif wiem,że cms-a powinny pisać osoby, które się znają na rzeczy, ale niestety mój szef od praktyk jest innego zdania wink.gif
aniolekx
ah tak pamiętam ten watek, to chyba raczej pomysł z Medoo nie przejdzie smile.gif
slash^
Mamy 2014 rok, PHP w wersji 5.6 a ludzie mysql_query polecają....

Tu masz dokładnie opisane jak to zrobić przez PDO: http://pl.wikibooks.org/wiki/PHP/Biblioteka_PDO
aniolekx
@slash^ nie ma się co dziwić, w obiegu jest pewnie sporo przeterminowanych książek do PHP / tutoriali, z których ludzie się uczą i nie wiedza jakie są standardy.
muumiin
I dlatego wujek google często zawodzi w tych kwestiach... Co wpiszę pytanie, to wyskakują mi odpowiedzi sprzed kilku lat... Szukanie ma sens jak się ustawi filtr na świeże daty wink.gif

@slash^ a pomógłbyś mi napisać takie zapytanie?

skleciłam taki kod, ale niestety nie działa...
  1. $stmt = $db->prepare("SELECT * FROM pages WHERE name=?");
  2. $stmt->execute(array($entered));
  3. $row = $stmt->fetch(PDO::FETCH_ASSOC);
  4. if($stmt->rowCount()>0){
  5. echo 'Strona' . $entered. 'odnaleziona';
  6.  
  7. }
  8. else{
  9. global $entered;
  10. echo 'Strona '.$entered. ' nie odnaleziona<br/>';
  11. }


mam połączenie z biblioteką, zmienna $entered też jest w porządku, bo wyświetla mi się napis o tym, że strona o tej nazwie nie została odnaleziona... w bazie mam jeden wiersz jak na razie (później ma być ich więcej), name='rejestracja', ale gdy $entered='rejestracja', to i tak wyświetla się, że nie odnaleziono...


Jak komuś chce się czytać wszystkie kody z moich plików, to mogę wrzucić, ale nie chcę Was tak zanudzać wink.gif
mmmmmmm
Zauważ, że zmienną $entered inicjujesz w linii 15 - tuż przed wyświetleniem komunikatu. Dlatego możesz mieć wrażenie, że wcześniej równiez ma prawidłową wartość. A tak nie jest... Przenieś ten global ... do pierwszej linii.
EDIT: Jak ty zedytowałaś, to ja również muszę... lini 9, nie 15.
muumiin
przeniosłam i dalej to samo...
zmienna entered jest zdefiniowana wcześniej, tutaj tylko wpisuje global $entered, bo ten kod jest w środku funkcji
trueblue
global nie jest potrzebne, bo tam nie ma żadnej funkcji (w sensie warunku if).
Sprawdź co masz w $entered, może pokaż var_dump($entered);
Nie musisz zaciągać wszystkich kolumn i całego wiersza:
  1. $stmt = $db->prepare("SELECT 1 FROM pages WHERE name=?");
  2. $stmt->execute(array($entered));
  3. $istnieje=$stmt->fetchColumn(0);
  4. $stmt->closeCursor();
  5. if(empty($istnieje)){
  6. //nie istnieje
  7. }
  8. else{
  9. //istnieje
  10. }
muumiin
w $entered mam tekst wpisany po ukośniku, czyli jeśli wpiszę adres np. localhost/test/rejestracja to $entered ="rejestracja".

w tabeli 'pages' mam wiersz dotyczący tej strony i potrzebuję go po prostu wczytać. Szukam go przez nazwę w kolumnie ('name')
Boshi
Wyświetl zawartość $entered.
Co jest trzymane w $entered przed wysłaniem zapytania?

W necie jest sporo poradników, z tym, że większosć jest bezużyteczna. Nauczysz się czegoś a za chwilę dowiadujesz się, że są inne standardy.

muumiin
Zrobiłam tak jak mówi @trueblue po if dałam
  1. echo 'Strona ' . $entered . ' nie istnieje';


Gdy wpiszę adres_mojej_strony/rejestracja wyskakuje napis: Strona rejestracja nie istnieje. Ale w bazie danych ona jest.
Połączenie z bazą mam na pewno, bo logowanie na stronie działa.
trueblue
Pokaż co daje wynik:
var_dump($entered);
muumiin
@trueblue
przy wpisaniu adres_mojej_strony/rejestracja:

string(11) "rejestracja"
trueblue
Jesteś pewna, że istnieje wiersz dokładnie z taką wartością?
Jakiego typu jest kolumna 'name'?
Turson
Pokaż kod po zmianach
muumiin
jestem pewna, sprawdzałam kilka razy. Typ kolumny name to text
trueblue
To sprawdź czy nie ma enter na końcu wartości w tym polu.
muumiin
@turson
  1. $stmt = $db->prepare("SELECT 'id','name','body','title' FROM pages WHERE name=?");
  2. $stmt->execute(array($entered));
  3. $istnieje=$stmt->fetchColumn(0);
  4. $stmt->closeCursor();
  5. if(empty($istnieje)){
  6. echo 'Strona '.$entered . ' nie istnieje ';
  7. }
  8. else{
  9. echo 'Strona '.$entered . ' istnieje ';
  10. }


w bazie mam dwa wiersze, w jednym name='rejestracja', w drugim name='strona'. I nie chce się wczytać nawet jak $entered='rejestracja' lub 'strona'.

@trueblue
właśnie sprawdziłam, nie ma żadnych białych znaków...
Turson
Nazwy kolum bierze się w ` a nie '
Wystarczyłoby obsługiwać błędy zapytań PDOException i od razu wiadomo.
nospor
@Turson akurat to co wskazales, nie generuje bledu zapytania, wiec jesli o to chodzi nadal by nie bylo nic wiadomo.
Ale tak, warto by włączyc rzucanie wyjatkow i sprawdzic czy w ogole połączylo się z bazą lub czy w ogole wykonalo sie poprawnie zapytanie. Wiele rzeczy po drodze moglo pojsc nie tak, a nikt tego tutaj nie sprawdza.
trueblue
Turson,
ale to nie spowoduje błędu. A tym bardziej, powinno jej dać wynik pozytywny, choć niekoniecznie zgodny z prawdą.
muumiin
Dzięki @Turson, wychodzą moje braki w podstawowej wiedzy...
poprawiłam, ale dalej nie działa
Turson
Nie generuje a powinno...
trueblue
Nie:) Bo wyciąga stałe bez aliasów.
nospor
Cytat
Nie generuje a powinno...
Widac nie tylko autorka tematu ma tu luki w podstawach wink.gif

@muumiin ustaw w PDO by rzucalo wyjątkami gdy cos bedzie nie tak. To moze wkoncu cos na ekranie sie pojawi
Turson
Acha ohmy.gif
możesz sprawdzić co siedzi w $istnieje i $entered dla pewnosci za wykonaniem zapytania, czyli var_dump
muumiin
@turson
w entered jest to co wpiszę w adresie po /
(już używałam tej funkcji do sprawdzenia,czy aby na pewno)
istnieje jest puste (bo wykonuje się to co w pętli if)

@nospor
wyskakuje:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected' in C:\WebServ\httpd\startuj\templates\include\dbpages.php:17 Stack trace: #0 C:\WebServ\httpd\startuj\templates\include\dbpages.php(17): PDOStatement->execute(Array) #1 C:\WebServ\httpd\startuj\index.php(9): dbPages('rejestracja') #2 {main} thrown in C:\WebServ\httpd\startuj\templates\include\dbpages.php on line 17

  1. $stmt->execute(array($entered));
  2. $istnieje=$stmt->fetchColumn(0); // linia 17
  3. $stmt->closeCursor();
  4. if(empty($istnieje)){
  5. echo 'Strona '.$entered . ' nie istnieje ';
  6. }
  7. else{
  8. echo 'Strona '.$entered . ' istnieje ';
  9. }
nospor
No brawo, w koncu...

Invalid catalog name: 1046 No database selected'

Chyba nie trzeba tego tlumaczyc?
muumiin
może się nie znam, ale dla mnie brzmi to, jak gdyby nie było połączenia z bazą...
Problem w tym, że mam takie połączenie, bo logowanie się działa...

Chyba że jednak o co innego chodzi?

Przed logowaniem i przed szukaniem strony mam identyczny kod:
  1. global $DBVARS;
  2. $db=new PDO('mysql:host='.$DBVARS['hostname'].';dbname='.$DBVARS['db_name'],$DBVARS['username'],$DBVARS['password']);
  3. $db -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  4. $db->query('SET NAMES utf8');
  5. $db->num_queries=0;
nospor
Ileż to razy ja już na tym forum slyszalem: "mam identyczny kod" ....

Komunikat bledu mowi, że nie wybrano bazy. Sprawdz wszystkie zmienne dokładnie.
muumiin

Chyba mi łeb ukręcicie...

Na początku każdego pliku załączałam config.php, a tutaj zapomniałam...Więc rzeczywiście nie było połączenia z bazą... Dzięki za pomoc i cierpliwość smile.gif
nospor
Cytat
a tutaj zapomniałam...
Aby unikac tak glupich bledow, nalezy wyswietlac wszystkie bledy
Tu masz napisane jak
Temat: Jak poprawnie zada pytanie
zastosuj sie do tego obowiązkowo
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.