<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>bazy danych - Kama Kaczmarek</title>
	<atom:link href="https://kamakaczmarek.net/tag/bazy-danych/feed/" rel="self" type="application/rss+xml" />
	<link>https://kamakaczmarek.net/tag/bazy-danych/</link>
	<description>Strona z materiałami dla uczniów i nauczycieli</description>
	<lastBuildDate>Tue, 10 Dec 2024 08:17:04 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>20. PHP – logowanie</title>
		<link>https://kamakaczmarek.net/php-logowanie/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Sun, 19 May 2019 19:49:00 +0000</pubDate>
				<category><![CDATA[aplikacje]]></category>
		<category><![CDATA[dla ucznia]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[bazy danych]]></category>
		<category><![CDATA[logowanie]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=2350</guid>

					<description><![CDATA[<p>Login: admin Hasło: admin baza -&#62;baza_cms -- phpMyAdmin SQL Dump-- version 5.1.1-- https://www.phpmyadmin.net/---- Host: 127.0.0.1-- Czas generowania: 01 Mar 2022, 12:53-- Wersja serwera: 10.4.21-MariaDB-- Wersja PHP: 8.0.10SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";START TRANSACTION;SET time_zone = "+00:00";/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;/*!40101 SET NAMES utf8mb4 */;---- Baza danych: `baza_cms`---- ------------------------------------------------------------ Struktura tabeli dla tabeli [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/php-logowanie/">20. PHP – logowanie</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Login: admin</p>



<p>Hasło: admin</p>



<p>baza -&gt;baza_cms</p>



<div>
<pre>-- phpMyAdmin SQL Dump<br />-- version 5.1.1<br />-- https://www.phpmyadmin.net/<br />--<br />-- Host: 127.0.0.1<br />-- Czas generowania: 01 Mar 2022, 12:53<br />-- Wersja serwera: 10.4.21-MariaDB<br />-- Wersja PHP: 8.0.10<br />SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";<br />START TRANSACTION;<br />SET time_zone = "+00:00";<br />/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;<br />/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;<br />/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;<br />/*!40101 SET NAMES utf8mb4 */;<br />--<br />-- Baza danych: `baza_cms`<br />--<br />-- --------------------------------------------------------<br />--<br />-- Struktura tabeli dla tabeli `users`<br />--<br />CREATE TABLE `users` (<br />&nbsp; `id` int(6) NOT NULL,<br />&nbsp; `login` varchar(255) NOT NULL,<br />&nbsp; `pass` varchar(255) NOT NULL<br />) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;<br />--<br />-- Zrzut danych tabeli `users`<br />--<br />INSERT INTO `users` (`id`, `login`, `pass`) VALUES<br />(1, 'admin', '$2y$10$Y1U9pwLzteMGAwvMHMXGGe.h3zMiTR2lKqYAzBKSQtytThGHZJASW');<br />--<br />-- Indeksy dla zrzutów tabel<br />--<br />--<br />-- Indeksy dla tabeli `users`<br />--<br />ALTER TABLE `users`<br />&nbsp; ADD PRIMARY KEY (`id`);<br />--<br />-- AUTO_INCREMENT dla zrzuconych tabel<br />--<br />--<br />-- AUTO_INCREMENT dla tabeli `users`<br />--<br />ALTER TABLE `users`<br />&nbsp; MODIFY `id` int(6) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;<br />COMMIT;<br />/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;<br />/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;<br />/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;</pre>
</div>



<p>conn_data.php</p>



<pre class="wp-block-code prettyprint"><code class="prettyprint lang-sql" style="font-size: 0.85em;">&lt;?php
$serwer='localhost'; //127.0.0.1 &nbsp;
$user='root';
$pass='';
$baza='baza_cms';
//łączenie z bazą
mysqli_report(MYSQLI_REPORT_OFF);
$db = @new mysqli($serwer, $user, $pass, $baza); //podejście obiektowe - korzystamy z klasy PHP o nazwie mysqli</code></pre>



<div>conn_close.php</div>



<pre class="wp-block-code prettyprint"><code class="prettyprint lang-sql" style="font-size: 0.85em;">&lt;?php
$db-&gt;close(); //zamykamy połączenie
?&gt;</code></pre>



<p>index.php</p>



<pre class="wp-block-code prettyprint"><code class="prettyprint lang-sql" style="font-size: 0.85em;">&lt;?php
#login:admin
#hasło:admin

session_start();

include_once('conn_data.php');
//sprawdzamy czy się łączy w podejściu obiektowym
if ($db->connect_error) {
    die('Błąd połączenia: ' . $db->connect_error);
} else {
    if (!isset($_POST&#91;'logowanie'])) {echo 'zaloguj się&lt;br>'; $msg='';}
    else
    {
        $msg='';
        $login=htmlspecialchars(trim($_POST&#91;'login']));
        $haslo=htmlspecialchars(trim($_POST&#91;'haslo']));
        if (empty($login) || empty($haslo))
        {
            $msg='Brak loginu lub hasła!';
        }
        else
        {
            $sql="SELECT * FROM `users` WHERE `login` = ?";
            $stmt = $db->prepare($sql);    
            $stmt->bind_param("s", $login);
            $stmt->execute();
            $wynik = $stmt->get_result();
            $ile_znaleziono = $wynik->num_rows;
           
            if ($ile_znaleziono>0) {
                $kolumna=$wynik->fetch_array();
                if(password_verify($haslo,$kolumna&#91;'pass'])){
                    $_SESSION&#91;'msg']='Jesteś zalogowany';
                    $_SESSION&#91;'witaj']=$login;
                    header("location: main.php");
                }  
                else { $msg='Podałeś błedne hasło!';}          
            }
            else { $msg='Nie ma w bazie użytkownika o takim loginie!';}        
        }      
    }  
}    
include_once('conn_close.php');
?>

&lt;!DOCTYPE html>
&lt;html>
&lt;head>
    &lt;title>Moja strona&lt;/title>
    &lt;meta charset="UTF-8">  
&lt;/head>
&lt;body>  
    &lt;form method="post" action="">
        &lt;span style="color: red;">&lt;?=$msg;?>&lt;/span>    
        &lt;input type="text" name="login">
        &lt;input type="password" name="haslo">
        &lt;button type="submit" name="logowanie">Loguj
    &lt;/form>
&lt;/body>
&lt;/html></code></pre>



<p>main.php</p>



<pre class="wp-block-code prettyprint"><code class="prettyprint lang-sql" style="font-size: 0.85em;">&lt;?php
session_start();
if($_SESSION&#91;'witaj']){
&nbsp; &nbsp; echo 'Witaj: '.$_SESSION&#91;'witaj'].'&lt;br&gt;';
&nbsp; &nbsp; if (isset($_GET&#91;'wyloguj'])) {
&nbsp; &nbsp; &nbsp; &nbsp; session_destroy();
&nbsp; &nbsp; &nbsp; &nbsp; header("location: index.php");
&nbsp; &nbsp; }
&nbsp; &nbsp; echo "&lt;a href=\"?wyloguj\"&gt;wyloguj&lt;/a&gt;";
}else{
&nbsp; &nbsp; header("location: index.php");
}</code></pre>


<p>Artykuł <a href="https://kamakaczmarek.net/php-logowanie/">20. PHP – logowanie</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>19. PHP – skrypty zmieniające dane w bazie danych</title>
		<link>https://kamakaczmarek.net/php-skrypty-zmieniajace-dane-w-bazie-danych/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Sun, 19 May 2019 19:46:00 +0000</pubDate>
				<category><![CDATA[aplikacje]]></category>
		<category><![CDATA[dla ucznia]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[bazy danych]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=2348</guid>

					<description><![CDATA[<p>Rozszerzamy skrypt z poprzednich zajęć o możliwość dodawania i usuwania rekordów w bazie. Przypominam, że w poniższym kodzie nie dokonaliśmy jeszcze zabezpieczeń odbieranych z formularza danych. Należy dokonać dodatkowo walidacji odbieranych danych, która uchroni nas przed atakami SQL Injection i XSS, a zapytania do bazy najlepiej opracowywać z wykorzystaniem Prepared Statements, o których trochę niżej. [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/php-skrypty-zmieniajace-dane-w-bazie-danych/">19. PHP – skrypty zmieniające dane w bazie danych</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Rozszerzamy skrypt z poprzednich zajęć o możliwość dodawania i usuwania rekordów w bazie.</p>



<p>Przypominam, że w poniższym kodzie nie dokonaliśmy jeszcze zabezpieczeń odbieranych z formularza danych.</p>



<p>Należy dokonać dodatkowo walidacji odbieranych danych, która uchroni nas przed atakami SQL Injection i XSS, a zapytania do bazy najlepiej opracowywać z wykorzystaniem <a href="https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php">Prepared Statements</a>, o których trochę niżej.</p>



<p>Do istniejącego formularza dodajemy 2 nowe inputy: Dodai i Usuń, następnie odbieramy dane i dokonujemy na ich podstawie zmian w bazie.&nbsp;</p>



<pre class="wp-block-code prettyprint"><code class="prettyprint lang-sql" style="font-size: 0.85em;">&lt;?php
//ustawiamy dane do bazy
$serwer = "localhost";
$user = "root";
$pass = "";
$base = "operacje_db";

mysqli_report(MYSQLI_REPORT_OFF);$db = @new mysqli($serwer, $user, $pass, $base);

if ($db->connect_error) {
    die('Błąd połączenia z bazą danych: ' . $db->connect_error);
} else {
    echo "Połączenie nawiązano&lt;br>";
    if (isset($_POST&#91;'przycisk'])) { //sprawdzamy czy kliknięto wyszukaj
        $sql = "SELECT * FROM `test` WHERE 1";
        if (!empty($_POST&#91;'imie'])) $sql .= " &amp;&amp; imie='{$_POST&#91;'imie']}'";
        if (!empty($_POST&#91;'nazwisko'])) $sql .= " &amp;&amp; nazwisko='{$_POST&#91;'nazwisko']}'";
        echo $sql . "&lt;br>";
        $wynik = $db->query($sql);
        foreach ($wynik as $row) {
            echo "Witaj {$row&#91;'imie']} {$row&#91;'nazwisko']}&lt;br>";
        }
    } elseif (isset($_POST&#91;'add'])) { //sprawdzamy czy kliknięto dodaj
        if (!empty($_POST&#91;'imie']) &amp;&amp; !empty($_POST&#91;'nazwisko'])) {
            $sql = "INSERT INTO `test`(`imie`, `nazwisko`) VALUES ('{$_POST&#91;'imie']}','{$_POST&#91;'nazwisko']}')";
            $wynik = $db->query($sql);
            //echo $db->affected_rows . ' ' . $db->insert_id;
            $ar = $db->affected_rows;
            if ($ar != 0) echo "Dodano {$_POST&#91;'imie']} {$_POST&#91;'nazwisko']}";
        } else {
            echo "Uzupełnij pola.";
        }
    } elseif (isset($_POST&#91;'del'])) { //sprawdzamy czy kliknięto usuń
        if (!empty($_POST&#91;'imie']) &amp;&amp; !empty($_POST&#91;'nazwisko'])) {
            $sql = "DELETE FROM `test` WHERE imie='{$_POST&#91;'imie']}' &amp;&amp; nazwisko='{$_POST&#91;'nazwisko']}'";
            $wynik = $db->query($sql);
            //echo $db->affected_rows . ' ' . $db->insert_id;
            $ar = $db->affected_rows;
            if ($ar != 0) echo "Usunięto rekordy w ilości: $ar o wartościach: {$_POST&#91;'imie']} {$_POST&#91;'nazwisko']}";
        } else {
            echo "Uzupełnij pola.";
        }
    } else {
        echo "Wykonaj akcję.";
    }
}

$db->close();
?>

&lt;form action="" method="post">
    Imię: &lt;input type="text" name="imie">
    Nazwisko: &lt;input type="text" name="nazwisko">
    &lt;input type="submit" value="Wyszukaj" name="przycisk">
    &lt;input type="submit" value="Dodaj" name="add">
    &lt;input type="submit" value="Usuń" name="del">
&lt;/form></code></pre>



<p>&nbsp;</p>



<h2 class="wp-block-heading">Wykorzystanie &#8222;bindowania&#8221;, czyli <a class="link" href="https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php">parameterized prepared statements</a> &#8211; bezpieczeństwo przede wszystkim</h2>



<p>Sparametryzowane zapytania pozwalają na wykonywanie kodu SQL zabezpieczonego przed SQL Injection.</p>



<p>Działa to w ten sposób, że najpierw przygotowujemy zapytanie, czyli do bazy wysyłany jest szablon kwerendy, w którym zamiast zmiennych podajemy znaki zapytania &#8211; &#8222;?&#8221;. Na tej podstawie serwer inicjuje swoje wewnętrzne zasoby do późniejszego wykorzystania.</p>



<p>W kolejnym kroku &#8222;bindujemy&#8221;, czyli wiązemy ze sobą wartości parametrów (każdemu znakowi zapytania przypisujemy zmienną) i wysyłamy je na serwer.</p>



<p>Na koniec zamykamy parametryzację, by zwolnić zasoby.</p>



<p>Ale dlaczego to takie bezpieczne?</p>



<p>Zbindowane zmienne są wysyłane do serwera niezależnie od zapytania, serwer używa tych wartości tylko w momencie wykonania, po przeanalizowaniu szablonu instrukcji. Parametry <span lang="pl">nigdy nie są bezpośrednio podstawiane w ciągu zapytania. Należy dostarczyć do serwera wskazówkę dotyczącą typu zmiennej powiązanej, aby utworzyć odpowiednią konwersję.</span></p>



<p>Przykład podstawowego użycia prepare statements</p>



<pre class="wp-block-code prettyprint"><code class="prettyprint lang-sql" style="font-size: 0.85em;">&lt;?php
//ustawiamy dane do bazy
$serwer = 'localhost'; //lub 127.0.0.1 - to jest nazwa serwera  
$user = 'root'; //użytkownik bazy danych
$pass = ''; //hasło do bazy
$baza = 'operacje_db'; //nazwa bazy

//łączenie z bazą
mysqli_report(MYSQLI_REPORT_OFF);$db = @new mysqli($serwer, $user, $pass, $baza); //podejście obiektowe - korzystamy z klasy PHP o nazwie mysqli

//sprawdzamy czy się łączy w podejściu obiektowym
if ($db->connect_error) {
    die('Błąd połączenia: ' . $db->connect_error);
} else {
    echo 'Połączenie nawiązano&lt;br />';
    if (isset($_POST&#91;'add'])) {
        $imie = !empty($_POST&#91;'imie']) ? $_POST&#91;'imie'] : 'nobody';
        $nazwisko = !empty($_POST&#91;'nazwisko']) ? $_POST&#91;'nazwisko'] : 'nobody';
        //przygotowujemy zapytanie
        $sql = "INSERT INTO `test`(`imie`, `nazwisko`) VALUES (?, ?)";
        $stmt = $db->prepare($sql);
        //bindujemy parametry
        $stmt->bind_param("ss", $imie, $nazwisko); //ss - oznacza string string
        //wykonujemy zapytanie
        $stmt->execute();
        echo "Dodano do bazy: $imie $nazwisko";
    } else {
        echo "Prześlij formularz.";
    }
}

$db->close(); //zamykamy połączenie
?>

&lt;form action="" method="POST">
    Imię: &lt;input type="text" name="imie">
    Nazwisko: &lt;input type="text" name="nazwisko">
    &lt;input type="submit" name="add" value="Dodaj">
&lt;/form></code></pre>



<h3 class="wp-block-heading">Przykład</h3>



<pre class="wp-block-code prettyprint"><code class="prettyprint lang-sql" style="font-size: 0.85em;">&lt;?php
//ustawiamy dane do bazy
$serwer = 'localhost'; //lub 127.0.0.1 - to jest nazwa serwera  
$user = 'root'; //użytkownik bazy danych
$pass = ''; //hasło do bazy
$baza = 'operacje_db'; //nazwa bazy

//łączenie z bazą
mysqli_report(MYSQLI_REPORT_OFF);$db = @new mysqli($serwer, $user, $pass, $baza); //podejście obiektowe - korzystamy z klasy PHP o nazwie mysqli

//sprawdzamy czy się łączy w podejściu obiektowym
if ($db->connect_error) {
    die('Błąd połączenia: ' . $db->connect_error);
} else {
    $imie = !empty($_POST&#91;'imie']) ? htmlspecialchars(trim($_POST&#91;'imie'])) : false;
    $nazwisko = !empty($_POST&#91;'nazwisko']) ? htmlspecialchars(trim($_POST&#91;'nazwisko'])) : false;
    if (isset($_POST&#91;'add'])) {
        if ($imie &amp;&amp; $nazwisko) {
            //----------------------------------------------------------------
            //przygotowujemy zapytanie
            $sql = "INSERT INTO `test`(`imie`, `nazwisko`) VALUES (?, ?)";
            $stmt = $db->prepare($sql);
            //bindujemy parametry
            $stmt->bind_param("ss", $imie, $nazwisko); //ss - oznacza string string, drugi parametr musi być zmienną (nie można wpisać bezpośrednio wartości)

            //wykonujemy zapytanie
            $stmt->execute();
            //----------------------------------------------------------------
            /*
            //tak możemy zobaczyć co jest w środku $stmt
            echo '&lt;pre>';
            print_r($stmt);
            echo '&lt;/pre>';
            */

            if ($stmt->affected_rows != 0) echo "Dodano do bazy: $imie $nazwisko";
            else echo "Nie dodano wiersza";
        } else {
            echo "Uzupełnij wszystkie pola";
        }
    } elseif (isset($_POST&#91;'search'])) { //w zależności od uzupełnionego pola w formularzu
        if ($imie || $nazwisko) {
            $sql = "SELECT * FROM `test` WHERE 1";
            //przygotowujemy dane do bindowania
            $b_data_types = '';
            $b_values = array();
            if (!empty($imie)) {
                $sql .= " &amp;&amp; imie=?";
                $b_data_types .= 's';
                array_push($b_values, $imie);
            }

            if (!empty($nazwisko)) {
                $sql .= " &amp;&amp; nazwisko=?";
                $b_data_types .= 's';
                array_push($b_values, $nazwisko);
            }

            //----------------------------------------------------------------
            //przygotowujemy zapytanie
            $stmt = $db->prepare($sql);
            $stmt->bind_param($b_data_types, ...$b_values);
            $stmt->execute();
            $wynik = $stmt->get_result();
            foreach ($wynik as $row) {
                echo "Witaj {$row&#91;'imie']} {$row&#91;'nazwisko']}&lt;br>";
            }
        } else {
            echo "Wypełnij przynajmniej jedno pole";
        }
    } elseif (isset($_POST&#91;'all'])) { //wyświetl wszystkie
        $sql = "SELECT * FROM `test`";
        //----------------------------------------------------------------
        //przygotowujemy zapytanie
        $stmt = $db->prepare($sql);
        $stmt->execute();
        $wynik = $stmt->get_result();
        foreach ($wynik as $row) {
            echo "Witaj {$row&#91;'imie']} {$row&#91;'nazwisko']}&lt;br>";
        }
    } else {
        echo "Prześlij formularz.";
    }
}

$db->close(); //zamykamy połączenie
?>

&lt;form action="" method="POST">
    Imię: &lt;input type="text" name="imie">
    Nazwisko: &lt;input type="text" name="nazwisko">
    &lt;input type="submit" name="add" value="Dodaj">
    &lt;input type="submit" name="all" value="Wyświetl wszystko">
    &lt;input type="submit" name="search" value="Wyszukaj">
&lt;/form>
</code></pre>


<p>Artykuł <a href="https://kamakaczmarek.net/php-skrypty-zmieniajace-dane-w-bazie-danych/">19. PHP – skrypty zmieniające dane w bazie danych</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>18. PHP – łączenie z bazą i operacje na bazie danych</title>
		<link>https://kamakaczmarek.net/php-laczenie-z-baza-i-operacje-na-bazie-danych/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Thu, 16 May 2019 19:41:00 +0000</pubDate>
				<category><![CDATA[aplikacje]]></category>
		<category><![CDATA[dla ucznia]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[bazy danych]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=2343</guid>

					<description><![CDATA[<p>PHP oferuje kilka możliwości połączenia z bazą danych: Podejście proceduralne MySQLi $db = mysqli_connect($serwer, $user, $pass, $baza); czyli przy domyślnych ustawieniach serwera: $db = mysqli_connect('localhost', 'root', '', 'twoja_baza_danych'); sprawdzamy, czy połączenie zostało nawiązane: if(!$db) error_log('Błąd połączenia: '. mysqli_connect_error()); Możemy wykorzystać jeden z dostępnych komunikatów błędów: mysqli_connect_errno() &#8211; Returns the error code from last connect call [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/php-laczenie-z-baza-i-operacje-na-bazie-danych/">18. PHP – łączenie z bazą i operacje na bazie danych</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>PHP oferuje kilka możliwości połączenia z bazą danych:</p>



<h2 class="wp-block-heading">Podejście proceduralne MySQLi</h2>



<p><code class="prettyprint lang-sql" style="font-size: 0.85em;"><span class="com">$db = mysqli_connect($serwer, $user, $pass, $baza); </span></code></p>



<p>czyli przy domyślnych ustawieniach serwera:</p>



<p><code class="prettyprint lang-sql" style="font-size: 0.85em;"><span class="com">$db = mysqli_connect('localhost', 'root', '', 'twoja_baza_danych'); </span></code></p>



<p>sprawdzamy, czy połączenie zostało nawiązane:</p>



<p><code class="prettyprint lang-sql" style="font-size: 0.85em;"><span class="com">if(!$db) error_log('Błąd połączenia: '. mysqli_connect_error()); </span></code></p>



<p>Możemy wykorzystać jeden z dostępnych komunikatów błędów:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><span class="function"><a class="function" href="https://www.php.net/manual/en/mysqli.connect-errno.php" rel="rdfs-seeAlso">mysqli_connect_errno()</a> &#8211; Returns the error code from last connect call</span></p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><span class="function"><a class="function" href="https://www.php.net/manual/en/mysqli.connect-error.php" rel="rdfs-seeAlso">mysqli_connect_error()</a> &#8211; Returns a description of the last connection error</span></p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><span class="function"><a class="function" href="https://www.php.net/manual/en/mysqli.errno.php" rel="rdfs-seeAlso">mysqli_errno()</a> &#8211; Returns the error code for the most recent function call</span></p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><span class="function"><a class="function" href="https://www.php.net/manual/en/mysqli.error.php" rel="rdfs-seeAlso">mysqli_error()</a> &#8211; Returns a string description of the last error</span></p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><span class="function"><a class="function" href="https://www.php.net/manual/en/mysqli.sqlstate.php" rel="rdfs-seeAlso">mysqli_sqlstate()</a> &#8211; Returns the SQLSTATE error from previous MySQL operation</span></p>
</blockquote>



<p>&nbsp;</p>



<h2 class="wp-block-heading">Podejście obiektowe MySQLi</h2>



<p><code class="prettyprint lang-sql" style="font-size: 0.85em;"><span class="com">$db = new mysqli($serwer, $user, $pass, $baza); </span></code></p>



<p>czyli przy domyślnych ustawieniach serwera:</p>



<p><code class="prettyprint lang-sql" style="font-size: 0.85em;"><span class="com">$db = new mysqli('localhost', 'root', '', 'twoja_baza_danych'); </span></code></p>



<p>sprawdzamy, czy połączenie zostało nawiązane:</p>



<p><code class="prettyprint lang-sql" style="font-size: 0.85em;"><span class="com">if($db-&gt;connect_error) error_log('Błąd połączenia: '. $mysqli-&gt;connect_error); </span></code></p>



<p>Możemy wykorzystać jeden z dostępnych komunikatów błędów:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><span class="function"><a class="function" href="https://www.php.net/manual/en/mysqli.connect-errno.php" rel="rdfs-seeAlso">mysqli_connect_errno()</a> &#8211; Returns the error code from last connect call</span></p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><span class="function"><a class="function" href="https://www.php.net/manual/en/mysqli.connect-error.php" rel="rdfs-seeAlso">mysqli_connect_error()</a> &#8211; Returns a description of the last connection error</span></p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><span class="function"><a class="function" href="https://www.php.net/manual/en/mysqli.errno.php" rel="rdfs-seeAlso">mysqli_errno()</a> &#8211; Returns the error code for the most recent function call</span></p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><span class="function"><a class="function" href="https://www.php.net/manual/en/mysqli.error.php" rel="rdfs-seeAlso">mysqli_error()</a> &#8211; Returns a string description of the last error</span></p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><span class="function"><a class="function" href="https://www.php.net/manual/en/mysqli.sqlstate.php" rel="rdfs-seeAlso">mysqli_sqlstate()</a> &#8211; Returns the SQLSTATE error from previous MySQL operation</span></p>
</blockquote>



<h2 class="wp-block-heading">&nbsp;</h2>



<h2 class="wp-block-heading">Łączenie z PDO &#8211; PHP Data Object</h2>



<p><code class="prettyprint lang-sql" style="font-size: 0.85em;"><span class="com">$pdo = new PDO("mysql:host=$serwer;dbname=$baza", "$user", "$pass"); </span></code></p>



<p>czyli przy domyślnych ustawieniach serwera:</p>



<p><code class="prettyprint lang-sql" style="font-size: 0.85em;"><span class="com">$pdo = new PDO("mysql:host=localhost;dbname=twoja_baza_danych", "root", ""); </span></code></p>



<p>sprawdzamy, czy połączenie zostało nawiązane &#8211; wykorzystamy do tego celu wyjątki:<code class="prettyprint lang-sql" style="font-size: 0.85em;"></code></p>



<pre class="wp-block-preformatted prettyprint">try{
    $pdo= new PDO("mysql:host=localhost;dbname=twoja_baza_danych", "root", "");
} catch (PDOException $e){
    echo "Błąd połączenia z bazą danych";
}</pre>



<p>Możemy wykorzystać jeden z dostępnych komunikatów błędów dostępny w <a href="https://www.php.net/manual/en/class.pdoexception">manualu.</a></p>



<p>&nbsp;</p>



<p>W pierwszej kolejności należy utworzyć bazę danych i wypełnić ją przykładowymi danymi.</p>



<p>Na potrzeby przykładu utworzyłam bazę o nazwie operacje_db, o strukturze:</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="436" src="https://kamakaczmarek.net/wp-content/uploads/struktura-tabeli-test-T2-baza-1024x436.png" alt="" class="wp-image-2192" srcset="https://kamakaczmarek.net/wp-content/uploads/struktura-tabeli-test-T2-baza-1024x436.png 1024w, https://kamakaczmarek.net/wp-content/uploads/struktura-tabeli-test-T2-baza-300x128.png 300w, https://kamakaczmarek.net/wp-content/uploads/struktura-tabeli-test-T2-baza-768x327.png 768w, https://kamakaczmarek.net/wp-content/uploads/struktura-tabeli-test-T2-baza.png 1164w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>W następnym kroku połączymy się z bazą i wyciągniemy dane z utworzonej tabeli.</p>



<pre class="wp-block-preformatted prettyprint"><code class="prettyprint lang-sql" style="font-size: 0.85em;"> &lt;?php<br />  //ustawiamy dane do bazy<br />  $serwer='localhost'; //lub 127.0.0.1 - to jest nazwa serwera  <br />  $user='root'; //użytkownik bazy danych<br />  $pass=''; //hasło do bazy<br />  $baza='operacje_db'; //nazwa bazy<br /><br />  //łączenie z bazą<br />  mysqli_report(MYSQLI_REPORT_OFF); // dodajemy tą linijkę, aby móc samodzielnie obsłużyć raportowanie błędów<br />  /* @ służy do wygłuszania/ukrywania ostrzeżeń */</code><br /><br />  //podejście obiektowe<code class="prettyprint lang-sql" style="font-size: 0.85em;"><br />  $db = @new mysqli($serwer, $user, $pass, $baza); //podejście obiektowe - korzystamy z klasy PHP o nazwie mysqli<br />  </code><br />  <code class="prettyprint lang-sql" style="font-size: 0.85em;">//tak jest w podejściu strukturalnym</code><br />  <code class="prettyprint lang-sql" style="font-size: 0.85em;">//$db = mysqli_connect($serwer, $user, $pass, $baza); <br /><br />  //sprawdzamy czy się łączy w podejściu obiektowym</code><br /><code class="prettyprint lang-sql" style="font-size: 0.85em;">  if($db-&gt;connect_error) </code><br /><code class="prettyprint lang-sql" style="font-size: 0.85em;">  {</code><br /><code class="prettyprint lang-sql" style="font-size: 0.85em;">      die('Błąd połączenia: '. $db-&gt;connect_error); </code><br /><code class="prettyprint lang-sql" style="font-size: 0.85em;">  }  </code><br /><br /><code class="prettyprint lang-sql" style="font-size: 0.85em;">  //sprawdzamy czy się łączy w podejściu proceduralnym<br />  /*if(!$db)<br />  {<br />      error_log('Błąd połączenia: '. mysqli_connect_error());<br />  }*/<br />  </code><br />  <code class="prettyprint lang-sql" style="font-size: 0.85em;">else<br />  {<br />        echo 'Połączenie nawiązano&lt;br /&gt;';<br /><br />        // wyciągamy wszystko z tabeli "test"<br />        $sql="SELECT * FROM `test` ";<br />        $wynik=$db-&gt;query($sql);<br /><br />        /* możemy podejrzeć co otrzymaliśmy<br />        echo '&lt;pre&gt;';<br />        print_r($db);<br />        echo '&lt;/pre&gt;';<br /><br />        echo '&lt;pre&gt;';<br />        print_r($wynik);<br />        echo '&lt;/pre&gt;';<br />        */<br /><br />        $ile_wierszy=$wynik-&gt;num_rows;<br />        echo 'ilość wierszy '.$ile_wierszy.'&lt;br /&gt;';<br /><br />        //wyciągamy dane z zapytania<br />        echo '&lt;table&gt;';<br />        echo '&lt;tr&gt;&lt;td&gt;Imie&lt;/td&gt;&lt;td&gt;Nazwisko&lt;/td&gt;&lt;/tr&gt;';<br />        //pętla po rekordach z bazy<br />        for ($i=0; $i &lt;$ile_wierszy; $i++)<br />            {<br />                $wiersz = $wynik-&gt;fetch_assoc(); //</code>pobiera kolejny wiersz wyników jako tablicę asocjacyjną<code class="prettyprint lang-sql" style="font-size: 0.85em;"><br />                echo '&lt;tr&gt;';<br />                echo '&lt;td&gt;'.$wiersz['imie'].'&lt;/td&gt;';<br />                echo '&lt;td&gt;'.$wiersz['nazwisko'].'&lt;/td&gt;';<br />                echo '&lt;/tr&gt;';<br />            }<br />        echo '&lt;/table&gt;';<br /> <br /><br />       //można to też zrobić za pomocą foreach<br />       foreach($wynik as $row) { <br />        echo $row["id"].'-'.$row['imie'].'&lt;br/&gt;';<br />      }   <br /><br /><br />  } <br />  $db-&gt;close(); //zamykamy połączenie<br />?&gt;</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">UWAGA: stosowanie query() nie zapewnia bezpieczeństwa w przypadku ataków SQJ Injection. Zamiast query należy używać <a class="link" href="https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php">parameterized prepared statements</a> (opracowanie w <a href="https://kamakaczmarek.net/php-skrypty-zmieniajace-dane-w-bazie-danych/">następnym temacie</a>). Aby query() było bezpieczne nalezy stosować <span class="function"><a class="function" href="https://www.php.net/manual/en/mysqli.real-escape-string.php">mysqli_real_escape_string()</a></span> .</h2>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Zamykanie połączenia z bazą</h2>



<p>Operacja zamknięcia połączenia jest automatycznie wykonywana po zakończeniu skryptu, jeżeli potrzebujemy zakończyć takie połączenie wcześniej robimy to za pomocą poleceń:</p>



<pre class="wp-block-preformatted prettyprint">//strukturalnie<br />mysqli_close($polaczenie); </pre>



<pre class="wp-block-preformatted prettyprint">//obiektowo<br />$mysqli-&gt;close();</pre>



<pre class="wp-block-preformatted prettyprint">//PHP Data Object - PDO<br />unset($pdo);</pre>



<p>&nbsp;</p>



<h2 class="wp-block-heading">Wyświetlanie informacji z bazy na podstawie danych z formularza</h2>



<p>Najczęściej dane z bazy wybieramy na podstawie pewnych warunków, jakie określi użytkownik.</p>



<p>Poniższy kod jest najprostszym przykładem, który należy jeszcze dopracować (dokonać walidacji).</p>



<pre class="wp-block-preformatted prettyprint"><br /> <span class="pun">&lt;?php<br />  //ustawiamy dane do bazy<br />  $serwer='localhost';</span> <span class="com">//lub 127.0.0.1 - to jest nazwa serwera  <br />  $user='root';</span> <span class="com">//użytkownik bazy danych<br />  $pass='';</span> <span class="com">//hasło do bazy<br />  $baza='operacje_db';</span> <span class="com">//nazwa bazy</span><br /><br />  <span class="com">//łączenie z bazą</span><br />  <code class="prettyprint lang-sql" style="font-size: 0.85em;">mysqli_report(MYSQLI_REPORT_OFF);</code><span class="pln"><br />  $db =</span> @<span class="kwd">new mysqli($serwer, $user, $pass, $baza);</span> <span class="com">//podejście obiektowe - korzystamy z klasy PHP o nazwie mysqli</span><br />  <br />  //sprawdzamy czy się łączy w podejściu obiektowym<br /><span class="com">  if($db->connect_error) {<br />      die('Błąd połączenia: '. $db->connect_error); </span><br />  } <span class="kwd">else {<br />        echo 'Połączenie nawiązano&lt;br />';<br />        //sprawdzamy czy kliknięto wyszukaj</span><br />        if (isset($_POST['przycisk'])) {<br />            //zaczynamy przygotowywać zapytanie<br />            $sql = "SELECT * FROM `test` WHERE 1 ";<br />            if (!empty($_POST['imie'])) $sql .= "&amp;&amp; imie LIKE '" . $_POST['imie'] . "'"; //do już istniejącego zapytania doklejamy warunki<br />            if (!empty($_POST['nazwisko'])) $sql .= " &amp;&amp; nazwisko LIKE '" . $_POST['nazwisko'] . "'";<br />            echo $sql;<br /><br />            $wynik = $db->query($sql);<br />            foreach ($wynik as $row) {<br />                echo "&lt;br/>Witaj {$row['imie']} &lt;br/>";<br />            }<br />        }else{<br />            echo "Prześlij formularz";<br />        }<br />  <span class="pun">} <br />  $db->close();</span> <span class="com">//zamykamy połączenie</span><br /><span class="pun">?></span><br />&lt;form action="" method="POST"><br />    Imię: &lt;input type="text" name="imie"><br />    Nazwisko: &lt;input type="text" name="nazwisko"><br />    &lt;input type="submit" name="przycisk" value="Wyszukaj"><br />&lt;/form></pre>



<p>&nbsp;</p>



<p>&nbsp;</p>
<p>Artykuł <a href="https://kamakaczmarek.net/php-laczenie-z-baza-i-operacje-na-bazie-danych/">18. PHP – łączenie z bazą i operacje na bazie danych</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>17. PHP – współpraca z bazami danych</title>
		<link>https://kamakaczmarek.net/php-wspolpraca-z-bazami-danych/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Thu, 16 May 2019 19:40:07 +0000</pubDate>
				<category><![CDATA[aplikacje]]></category>
		<category><![CDATA[dla ucznia]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[bazy danych]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=2340</guid>

					<description><![CDATA[<p>Najwygodniejszym i optymalnym miejscem do przechowywania dużej ilości informacji są bazy danych. Aby PHP mógł korzystać z bazy danych musi być spełnione kilka warunków: serwer bazy danych musi istnieć i PHP musi się z nim połączyć. Komunikacja z bazą danych może przebiegać z wykorzystaniem 2 wbudowanych bibliotek (3cia została już zdeprecjonowana od wersji PHP5.5), należą [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/php-wspolpraca-z-bazami-danych/">17. PHP – współpraca z bazami danych</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="entry-content">
<p>Najwygodniejszym i optymalnym miejscem do przechowywania dużej ilości informacji są bazy danych.</p>
<p>Aby PHP mógł korzystać z bazy danych musi być spełnione kilka warunków: serwer bazy danych musi istnieć i PHP musi się z nim połączyć.</p>
<p>Komunikacja z bazą danych może przebiegać z wykorzystaniem 2 wbudowanych bibliotek (3cia została już zdeprecjonowana od wersji PHP5.5), należą do nich:</p>
<ul>
<li>mysqli – wersja poprawiona i aktualna wycofanej od PHP7 biblioteki mysql. To rozszerzenie może być stosowane w podejściu proceduralnym i obiektowym. Współpracuje tylko z bazami MySQL.</li>
<li>PDO – PHP Data Objects. To rozszerzenie jest w pełni obiektowe i współpracuje z wieloma silnikami bazy danych, nie tylko MySQL.</li>
</ul>
<p>Bazę danych na serwerze oraz tabele i połączenia między nimi możesz stworzyć z poziomu języka PHP, jak również bezpośrednio na serwerze np. w phpMyAdmin.</p>
<h2>MySQL i MariaDB</h2>
<p>RDBMS &#8211; czyli system zarządzania relacyjnymi bazami danych.</p>
<p>MySQL i MariaDB są właśnie takimi systemami.</p>
<p>MariaDB powstała jako alternatywa dla MySQL, którego licencja jest zależna od Oracle.</p>
<p>MariaDB ma licencję GPL.</p>
<p>Oba rozwiązania są darmowe, MariaDB jest rozwiązaniem młodszym i oferuje lepsze silniki obsługi pamięci masowej, natomiast MySQL jest najpopularniejszym systemem obsługi SQL.</p>
<p>Więcej o tych dwóch systemach możecie przeczytać na stronie <a href="https://hostclub.pl/mariadb-vs-mysql-porownanie-baz-danych/">https://hostclub.pl/mariadb-vs-mysql-porownanie-baz-danych/</a></p>
</div>
<p>Artykuł <a href="https://kamakaczmarek.net/php-wspolpraca-z-bazami-danych/">17. PHP – współpraca z bazami danych</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
