Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Połaczenie z bazą danych a insert
marcwars
post 26.01.2013, 11:20:56
Post #1





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 14.02.2011
Skąd: Wawa

Ostrzeżenie: (0%)
-----


Witam
od paru dni próbuję przypomnieć sobie podstawy OOP tworząc prostego cmsa z funkcją dodawania artykułów.
Jednak wywala mi się błąd: No database selected. Do kodu włączyłem nowe funkcje mysqli, więc chyba tam jest błąd, niestety po godzinach ślęczenia, nie potrafię go znaleźć.

Formularz:

Kod
<html>
<body>
<form action="dzieki.php" method="post">
Autor: <input type="text" name="autor"><br /><br />
Tytuł: <input type="text" name="tytul"><br /><br />
Tekst: <input type="text" name="tekst"><br /><br />
<input type="submit" value="Dodaj">
</form>
</body>
</html>


klasy (class/DB_pt.class.php):

Kod
<?php

class DB {
    
    protected $db_name = 'aaa';
    protected $db_user = 'root';
    protected $db_pass = 'aaa';
    protected $db_host = 'localhost';
    

    public function connect() {
        $connection = new mysqli($this->db_host, $this->db_user, $this->db_pass, $this->db_name);
        //mysql_select_db($this->db_name);
        
        return true;
    }
    
    public function insert($data, $table) {    
        $columns = "";
        $values = "";
        foreach ($data as $column => $value) {
            $columns .= ($columns == "") ? "" : ", ";
            $columns .= $column;
            $values .= ($values == "") ? "" : ", ";
            $values .= $value;
        }
        $sql = "insert into $table ($columns) values ($values)";        
        mysql_query($sql) or die(mysql_error());
        return mysql_insert_id();
        echo 'Dziękujemy, że dodałeś artykuł:)';
    }
    
}

?>


dzieki.php

Kod
<?php
include 'class/DB_pt.class.php';
$db = new DB();
$db -> connect();
$data = array(
"$_POST[autor]" => "autor",
"$_POST[tytul]" => "tytul",
"$_POST[tekst]" => "tekst"
);
$db->insert($data, 'artykuly');
?>




Na pewno ścieżki i nazwy tabel są prawidłowe, czy ktoś może mi wskazać błąd?

Ten post edytował marcwars 26.01.2013, 11:23:20
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 16)
mortus
post 26.01.2013, 12:09:32
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


W jednej linii korzystasz z mysqli, a w kolejnej z mysql.

PS. Funkcja insert korzysta z funkcji mysql_*, a nie z mysqli_*. Wybierz albo jedno, albo drugie.

Ten post edytował mortus 26.01.2013, 12:12:17
Go to the top of the page
+Quote Post
404
post 26.01.2013, 12:11:59
Post #3





Grupa: Zarejestrowani
Postów: 226
Pomógł: 25
Dołączył: 22.05.2011

Ostrzeżenie: (0%)
-----


Używasz 2 rzeczy, których raczej nie wypada mieszać. Tworzysz obiekt MySQLi, a następnie wywołujesz funkcje MySQL.

@up: uprzedził mnie kolega smile.gif

Ten post edytował 404 26.01.2013, 12:12:24
Go to the top of the page
+Quote Post
marcwars
post 26.01.2013, 20:57:25
Post #4





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 14.02.2011
Skąd: Wawa

Ostrzeżenie: (0%)
-----


Cytat(mortus @ 26.01.2013, 12:09:32 ) *
W jednej linii korzystasz z mysqli, a w kolejnej z mysql.

PS. Funkcja insert korzysta z funkcji mysql_*, a nie z mysqli_*. Wybierz albo jedno, albo drugie.


Niestety, wstawiłem w kodzie klasy:

zamiast:
Kod
mysql_query($sql) or die(mysql_error());
        return mysql_insert_id();


nowy kod:

Kod
mysqli_query($sql) or die(mysql_error());
        return mysqli_insert_id();


ale wychodzi błąd mysqli_query() expects at least 2 parameters, 1 given in 'nazwa_pliku' on line 76, to zła funkcja w mysqli?

Ten post edytował marcwars 26.01.2013, 20:57:58
Go to the top of the page
+Quote Post
aras785
post 26.01.2013, 21:05:29
Post #5





Grupa: Zarejestrowani
Postów: 859
Pomógł: 177
Dołączył: 29.10.2009

Ostrzeżenie: (0%)
-----


Daj wszystko. No i funkcji insert (w/w) najpierw komunikat, a później return smile.gif
Go to the top of the page
+Quote Post
marcwars
post 27.01.2013, 09:08:40
Post #6





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 14.02.2011
Skąd: Wawa

Ostrzeżenie: (0%)
-----


Zmieniłem kolejność, ale dalej pojawia się ten sam błąd, czyli, że funkcja mysqli_query potrzebuje co najmniej 2 parametrów, a jest tylko 1:)
Go to the top of the page
+Quote Post
abort
post 27.01.2013, 10:22:33
Post #7





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

Ostrzeżenie: (0%)
-----


mysqli_query działa w dwóch trybach: proceduralnym i obiektowym. W trybie obiektowym wystarczy jeden parametr, w trybie proceduralnym funkcja OCZEKUJE dwóch parametrów. Ty używasz mysqli w trybie proceduralnym (pomimo tego że uzywasz tego w innym obiekcie). Więcej w manualu: http://pl1.php.net/manual/en/mysqli.query.php (take z przykładami użycia obu trybów). Przeczytaj, przetraw - przecież nie będziemy Ci tłumaczyć sposobu używania funkcji, bo od tego jest manual...

Go to the top of the page
+Quote Post
marcwars
post 27.01.2013, 11:24:11
Post #8





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 14.02.2011
Skąd: Wawa

Ostrzeżenie: (0%)
-----


Zmieniłem w klasie funkcję insert na:

Kod
public function insert($data, $table) {    
        $columns = "";
        $values = "";
        foreach ($data as $column => $value) {
            $columns .= ($columns == "") ? "" : ", ";
            $columns .= $column;
            $values .= ($values == "") ? "" : ", ";
            $values .= $value;
        }
$con = $this->connect();
        $sql = "insert into $table ($columns) values ($values)";        
        $result = $con->query($sql);
echo 'Dziękujemy, że dodałeś artykuł:)<br />';
        return $result;
        
    }


Nie pokazuje błędu, ale nie dodaje danych do bazy, czy wiecie gdzie jest błąd?
Go to the top of the page
+Quote Post
mortus
post 27.01.2013, 18:48:38
Post #9





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


Przecież według tego, co pisałeś na początku, metoda connect zwraca true. Zatem nowa wersja metody insert jest kompletnie bez sensu. Tutaj nie chodziło o nieprawidłową budowę funkcji insert, ale o to, że naprzemiennie wykorzystujesz mysql i mysqli, a powinieneś korzystać tylko z jednego z tych dwóch rozszerzeń. Przede wszystkim zachęcam do przejrzenia tego fragmentu dokumentacji, bo wszystko jest tam dokładnie pokazane w przykładach.

PS: Na pierwszy rzut oka pętla foreach nie zbuduje Ci prawidłowego fragmentu zapytania.

Ten post edytował mortus 27.01.2013, 18:49:58
Go to the top of the page
+Quote Post
abort
post 27.01.2013, 18:52:20
Post #10





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

Ostrzeżenie: (0%)
-----


Nie wiemy. Fusów nie mamy, bo herbatę pijemy ekspresową, kawę zrestą tez z ekspresu. A szklana kula nam się zepsuła.

Od tego jest debugowanie, w którym pomagają takie zaklęcia jak echo, print_r czy var_dump. Ponadto przy pracy z bazą danych warto przetestować komendę SQL w konsoli bazy.
Go to the top of the page
+Quote Post
marcwars
post 29.01.2013, 21:32:32
Post #11





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 14.02.2011
Skąd: Wawa

Ostrzeżenie: (0%)
-----


Poprawiłem kod pliku z klasą, tak że funkcja connect() już nie zwraca true, ale połączenie z bazą:

Kod
<?php

class DB {
    
    protected $db_name = 'aaa';
    protected $db_user = 'root';
    protected $db_pass = 'aaa';
    protected $db_host = 'localhost';
    

    public function connect() {
        $connection = new mysqli($this->db_host, $this->db_user, $this->db_pass, $this->db_name);
            
        return $connection;
    }
    
   public function insert($data, $table) {    
        $columns = "";
        $values = "";
        foreach ($data as $column => $value) {
            $columns .= ($columns == "") ? "" : ", ";
            $columns .= $column;
            $values .= ($values == "") ? "" : ", ";
            $values .= $value;
        }
$con = connect();
        $sql = "insert into $table ($columns) values ($values)";        
        $result = $con->query($sql);
echo 'Dziękujemy, że dodałeś artykuł:)<br />';
        return $result;
        
    }
    
}

?>


Niestety teraz pokazuje mi, że odwołuje się do nieznanej funkcji connect(), chociaż ta wcześniej jest public...

Ten post edytował marcwars 29.01.2013, 21:33:17
Go to the top of the page
+Quote Post
mortus
post 30.01.2013, 08:44:15
Post #12





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


Wywołując connect() nie odnosisz się do metody zdefiniowanej wewnątrz klasy, ale do jakiejś tam globalnej funkcji (która w tym przypadku nie istnieje).
Użyj $this->connect().

Poza tym kilka uwag:
  • dane dostępu do bazy nie powinny być przechowywane na sztywno w klasie - pamiętaj, że one mogą się zmieniać, zatem powinny być zlokalizowane np. w pliku konfiguracyjnym i przekazywane/pobierane w momencie tworzenia instancji klasy DB
  • połączenie z bazą danych powinieneś nawiązać raz, a co za tym idzie powinno to nastąpić w momencie tworzenia instancji klasy DB
  • pamiętaj, że metody mogą zwracać różne wartości i warto to kontrolować, bo w tej chwili nie wiemy (nie wiesz), czy w ogóle udaje Ci się nawiązać połączenie z bazą danych


Ten post edytował mortus 30.01.2013, 08:44:30
Go to the top of the page
+Quote Post
marcwars
post 30.01.2013, 19:50:12
Post #13





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 14.02.2011
Skąd: Wawa

Ostrzeżenie: (0%)
-----


Witam, wstawiłem $con=$this->connect(), ale nie działa- kod nie dodaje danych do bazy, nie pokazuje też żadnego błędu i pojawiają się końcowe o dodaniu do bazy.

Kod
public function insert($data, $table) {    
        $columns = "";
        $values = "";
        foreach ($data as $column => $value) {
            $columns .= ($columns == "") ? "" : ", ";
            $columns .= $column;
            $values .= ($values == "") ? "" : ", ";
            $values .= $value;
        }
$con = $this->connect();
        $sql = "INSERT INTO $table ($columns) VALUES ($values)";        
        $result = $con->query($sql);
echo 'Dziękujemy, że dodałeś artykuł:)<br />';
        return $result;
        
    }




Ten post edytował marcwars 30.01.2013, 19:55:35
Go to the top of the page
+Quote Post
mortus
post 30.01.2013, 19:55:09
Post #14





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


Zapewne dlatego, że źle definiujesz tablicę $data (tzn. zamieniasz wartości z nazwami kolumn podczas odbierania danych z $_POST). Poczytaj o sposobach na debugowanie skryptu php.
Go to the top of the page
+Quote Post
marcwars
post 31.01.2013, 08:08:47
Post #15





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 14.02.2011
Skąd: Wawa

Ostrzeżenie: (0%)
-----


Wszystko prawie działa, ale przy jednej zmiennej, czyli kod dodaje autora do bazy:

Kod
error_reporting(E_ALL);
ini_set('display_errors', '1');
include 'class/DB_pt.class.php';
$db = new DB();
$db -> connect();
$autor = 'autor';
define('autor', 'autor');


$data = array(
$autor => $_POST[autor],
//$tytul => $_POST[tytul],
//$tekst => $_POST[tekst]
);
$db->insert($data, 'artykuly');


ale już kod poniżej nic nie dodaje:

Kod
error_reporting(E_ALL);
ini_set('display_errors', '1');
include 'class/DB_pt.class.php';
$db = new DB();
$db -> connect();
$autor = 'autor';
define('autor', 'autor');
$tytul = 'tytul';
define('tytul', 'tytul');
$tekst = 'tekst';
define('tekst', 'tekst');

$data = array(
$autor => $_POST[autor],
$tytul => $_POST[tytul],
$tekst => $_POST[tekst]
);
$db->insert($data, 'artykuly');


Jaka jest tego przyczyna? Zmienne są podobnie opisane.
Go to the top of the page
+Quote Post
mortus
post 31.01.2013, 09:06:03
Post #16





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


  1. // zamiast
  2. $data = array(
  3. $autor => $_POST[autor],
  4. // ...
  5. );
  6. // powinno być
  7. $data = array(
  8. 'autor' => $_POST['autor'],
  9. 'tytul' => $_POST['tytul'],
  10. 'tekst' => $_POST['tekst']
  11. );


Oczywiście te dane trzeba jeszcze przefiltrować, bo w tej chwili skrypt narażony będzie na SQL Injection.
Nie obraź się, ale zabierasz się za programowanie obiektowe, a podstawy "leżą". Sięgnij po jakąś lekturę, czy tutorial.

Klasę, którą napisałeś mógłbyś zastąpić PDO.
Go to the top of the page
+Quote Post
marcwars
post 6.02.2013, 18:11:28
Post #17





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 14.02.2011
Skąd: Wawa

Ostrzeżenie: (0%)
-----


@Mortus, to prawda, że podstawy trochę u mnie leżą, stąd staram się przypomnieć je na realnym przykładzie.

Wstawiłem tak:
Kod
error_reporting(E_ALL);
ini_set('display_errors', '1');
include 'class/DB_pt.class.php';
$db = new DB();
$db -> connect();
$autor = 'autor';
define('autor', 'autor');
$tytul = 'tytul';
define('tytul', 'tytul');
$tekst = 'tekst';
define('tekst', 'tekst');

$data = array(
'autor' => $_POST[autor],
'tytul' => $_POST[tytul],
'tekst' => $_POST[tekst]
);
$db->insert($data, 'artykuly');

... ale ten kod nie dodaje nic do bazy, komunikat pojawia się zgodny z funkcją insert($data, $table) z klasy.
Jak dodam do powyższego kod:
Kod
print_r($data);
to mi się wyświetla prawidłowo tablica, czyli:
Cytat
Array ([autor] => xxx [tytul] => xxx [tekst] => xxx )
Już sam nie wiem, co może być nie tak.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 13:49