• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pobranie danej z bazy

Object Storage Arubacloud
0 głosów
215 wizyt
pytanie zadane 14 czerwca 2017 w PHP przez sonewbie Użytkownik (690 p.)
edycja 14 czerwca 2017 przez HaKIM

Hej. Próbuję według instrukcji, ale mam nowsze php i mi nie wychodzi tak jak powinno.

 

Nie wiem do końca jak sprecyzować problem.

Chcę pobrać kilka danych z tabeli bazy, i mam tak:

W sekcji body:

 <div class="container">
    <h2>pages</h2>
        <div class="pages">
            <?php foreach($pages as $page): ?>
                <p><?php echo $page["title"]; ?></p>
            <?php endforeach; ?>
        </div>
    </div>

A na samej górze pliku mam:

<?php
require_once(__DIR__."/../connect.php");

?>
<?php
$polaczenie = @new mysqli($host, $db_user, $db_password, $db_name);
$pages = getPages();
function getPages()
{
$polaczenie->query(
sprintf("SELECT id, title, body FROM pages",
mysqli_real_escape_string($polaczenie,$login),
mysqli_real_escape_string($polaczenie,$haslo)));
}
?>

Dostaję błędy

Notice: Undefined variable: polaczenie in C:\xampp\htdocs\cms1\pages\index.php on line 10

Fatal error: Uncaught Error: Call to a member function query() on null in C:\xampp\htdocs\cms1\pages\index.php:10 Stack trace: #0 C:\xampp\htdocs\cms1\pages\index.php(7): getPages() #1 {main} thrown in C:\xampp\htdocs\cms1\pages\index.php on line 10

Ale kompletnie nie wiem o co chodzi, po każdej zmianie nowe błędy.

Powinien mi wyjść taki efekt jak w tej minucie https://youtu.be/n7BbkY-8iPI?t=450.

 

Pomocy :(

 

3 odpowiedzi

0 głosów
odpowiedź 14 czerwca 2017 przez Chess Szeryf (76,710 p.)
wybrane 14 czerwca 2017 przez sonewbie
 
Najlepsza
<?php

$connect = new mysqli('localhost','root','','zakupy'); 
$succeed = $connect->query("SELECT jaki_towar,id,ile from zakupy");

while($result[]= $succeed->fetch_assoc());

echo $result[0]['jaki_towar'];

//print_r($result);
?>

 

komentarz 14 czerwca 2017 przez sonewbie Użytkownik (690 p.)

Dziękuję, coś tam to działa, bo przestało błędy wywalać i nawet brzmi zrozumiale dla mojego małego mózgu:D

Mam tylko jeszcze taki problem, że wypisuje mi pięć tytułów z kolumny 'title', a w kolumnie są 4 tytuły,

i każdy nazywa się page1, tak jak pierwszy z bazy.

Kolejne tytuły nazywają się inaczej i jakby nie są wyświetlane z echem.

Po przeróbce mam tak:

na górze:

<?php
 
$connect = new mysqli('localhost','root','','cms1'); 
$succeed = $connect->query("SELECT id, title, body from pages");
 
while($result[]= $succeed->fetch_assoc());
?>

a niżej w body:

<div class="container">
        
    <h2>pages</h2>
        <div class="pages">
            <?php foreach($result as $page): ?>
                <p><?php echo $result[0]['title']; ?></p>
            <?php endforeach; ?>
        </div>
    </div>

Jest jakiś sposób, aby uzyskać tu wszystko po kolei z kolumny 'title'?

komentarz 14 czerwca 2017 przez Chess Szeryf (76,710 p.)

Jest jakiś sposób, aby uzyskać tu wszystko po kolei z kolumny 'title'?

Napisz pętlę.

Mam tylko jeszcze taki problem, że wypisuje mi pięć tytułów z kolumny 'title', a w kolumnie są 4 tytuły,

To powinno pomóc:

http://php.net/manual/en/mysqli-result.num-rows.php

Jeśli zwróci o jeden record więcej to trzeba odjąć jeden, chociaż nie wiem, czy jest to poprawny sposób.

$quantity = $succeed->num_rows-1;
// or
$quantity = $succeed->num_rows;

Kolejne tytuły nazywają się inaczej i jakby nie są wyświetlane z echem.

Jak już wspomniałem napisz odpowiednią pętlę do tego.

echo $result[$i]['title'];

 

komentarz 14 czerwca 2017 przez sonewbie Użytkownik (690 p.)
Dziękuję, popróbuję :)
+1 głos
odpowiedź 14 czerwca 2017 przez Ehlert Ekspert (212,670 p.)

No tak wynika to z tego, że bezpośrednio wywołujesz query na zmiennej globalnej w ciele funkcji. Dlatego nie może jej znaleźć. Nie jest to dobra praktyka ale cóż smiley przed connection w ciele funkcji daj  global

OOP pozwala uniknąć takich problemów. 

komentarz 14 czerwca 2017 przez Boshi VIP (100,240 p.)
bo nie da się przekazać argumentu do funkcji :)?
komentarz 14 czerwca 2017 przez CzikaCarry Szeryf (75,340 p.)
Po co przekazywać połączenie jako argument do funkcji, skoro będzie to tylko kopiowanie tego samego połączenia*

*ampersand cuda zdziała:)

O wiele lepiej jest w klasie mieć pole z połączeniem z bazą, ewentualnie w innej statycznej klasie, wtedy to już w ogóle dobra faza :D
komentarz 14 czerwca 2017 przez Mateusz Analityk Stary wyjadacz (13,710 p.)
Obecnie odchodzi się od używania zmiennych globalnych, tak nam tłucze cały czas nasz profesor, że jest to nieeleganckie.
komentarz 14 czerwca 2017 przez sonewbie Użytkownik (690 p.)
Dziękuję za wskazówkę, w takim razie wyzbywam się złego nawyku, ale zanotowane w kajeciku, że tak też można :)
komentarz 14 czerwca 2017 przez Boshi VIP (100,240 p.)
Czika, jakie kopiowanie? robisz jedno połączenie a potem przekazujesz sobie do funkcji tylko obiekt mysqli i tyle? gdzie tu masz łączenie powtórne. Przekazywanie przez referencje nigdy nie było dobrym pomysłem..

 

connect.php

$mysqli=....

 

//function.php

include 'connect.php';

function (mysqli $mysqli) {$mysqli ->query(); }

Na pewno jest to lepsze niż global.
komentarz 14 czerwca 2017 przez CzikaCarry Szeryf (75,340 p.)
Chodzi mi o to, że jeśli przekażesz ten obiekt jako parametr funkcji to będą w pamięci 2 takie same obiekty. Po co? Wiem, jest to bardzo mało pamięci i raczej nie odczujemy różnicy, ale po co, skoro wystarczy wpisać dodatkowo jeden znak?
komentarz 14 czerwca 2017 przez Ehlert Ekspert (212,670 p.)

Chodzi mi o to, że jeśli przekażesz ten obiekt jako parametr funkcji to będą w pamięci 2 takie same obiekty.

Jeśli mówisz o PHP >= 5, to jest to bzdura.  

komentarz 14 czerwca 2017 przez CzikaCarry Szeryf (75,340 p.)
Nie wiem, nie wczytuję się aż tak dokładnie w update'y poszczególnych wersji PHP'a, ale na własnych oczach dam radę zauważyć, że jeśli wyślę obiekt jako parametr nie używając ampersanda, to obiekt będzie wysłany poprzez identyfikator ("referencję na referencję"), a nie referencję, a więc coś musi siedzieć w tej pamięci.
komentarz 14 czerwca 2017 przez Ehlert Ekspert (212,670 p.)
Nawet jeśli, to "Referencja na referencję" jest wciąż referencją. Nie dwoma obiektami.
0 głosów
odpowiedź 15 czerwca 2017 przez sonewbie Użytkownik (690 p.)

Gdyby kogoś to kiedyś interesowało, zadziałało mi w ten sposób

<?php
 
$connect = new mysqli('localhost','root','','cms1'); 
$succeed = $connect->query("SELECT id, title, body from pages");
 
while($result[]= $succeed->fetch_assoc());

?>



<?php foreach($result as $page): ?>
<p><?php echo $page['title']; ?></p>
<?php endforeach; ?>

 

Podobne pytania

+3 głosów
2 odpowiedzi 216 wizyt
0 głosów
0 odpowiedzi 215 wizyt
pytanie zadane 2 czerwca 2019 w PHP przez Piotr Jarema Użytkownik (970 p.)
+1 głos
3 odpowiedzi 266 wizyt

92,573 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...