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

Dodanie do tabeli sql w jednym id więcej niż jedno zdjęcie w php PDO

VPS Starter Arubacloud
+1 głos
498 wizyt
pytanie zadane 10 marca 2022 w PHP przez gatka84 Bywalec (2,150 p.)

Witajcie, próbuje swoich sił w php PDO i napotkałam podczas przerabiania tutorialii na problem mianowicie chce przy zapisie w jednym wpisie do bazy przesłać do kolumn kilka zdjęć (np2 lub więcej max 5) i tekstu, mam już działający kod ale wysyła tylko jedno zdjęcie myślałam, że jeśli zrobię analogicznie z większą ilością nie powinno być problemu a tu jednak

if(isset($_REQUEST['btn_insert']))
{
	try
	{
		$author	= $_REQUEST['txt_author'];	//textbox name "txt_author"
		$title	= $_REQUEST['txt_title'];	//textbox name "txt_title"
		$excerpt	= $_REQUEST['txt_excerpt'];	//textbox name "txt_excerpt"
		$content	= $_REQUEST['txt_content'];	//textbox name "txt_content"
			
		$image_file	= $_FILES["txt_file"]["name"];
		$type		= $_FILES["txt_file"]["type"];	//file name "txt_file"	
		$size		= $_FILES["txt_file"]["size"];
		$temp		= $_FILES["txt_file"]["tmp_name"];
		
		$path="upload/".$image_file; //set upload folder path
		
		if(empty($author)){
			$errorMsg="Please Enter Name";
		}
		else if(empty($image_file)){
			$errorMsg="Please Select Image";
		}
		else if($type=="image/jpg" || $type=='image/jpeg' || $type=='image/png' || $type=='image/webp') //check file extension
		{	
			if(!file_exists($path)) //check file not exist in your upload folder path
			{
				if($size < 1000000) //check file size 1MB
				{
					move_uploaded_file($temp, "upload/" .$image_file); //move upload file temperory directory to your upload folder
				}
				else
				{
					$errorMsg="Your File To large Please Upload 5MB Size"; //error message file size not large than 5MB
				}
			}
			else
			{	
				$errorMsg="File Already Exists...Check Upload Folder"; //error message file not exists your upload folder path
			}
		}
		else
		{
			$errorMsg="Upload JPG , JPEG , PNG & WEBP File Formate.....CHECK FILE EXTENSION"; //error message file extension
		}
		
		if(!isset($errorMsg))
		{
			$insert_stmt=$db->prepare('INSERT INTO blog(blog_date,blog_author,blog_title,blog_excerpt,blog_content,blog_image) VALUES(:fdate,:fauthor,:ftitle,:fexcerpt,:fcontent,:fimage)'); //sql insert query					
            $insert_stmt->bindValue(':fdate',time());
			$insert_stmt->bindParam(':fauthor',$author);	
			$insert_stmt->bindParam(':ftitle',$title);	
			$insert_stmt->bindParam(':fexcerpt',$excerpt);	
			$insert_stmt->bindParam(':fcontent',$content);	
			$insert_stmt->bindParam(':fimage',$image_file);	  //bind all parameter 
		
			if($insert_stmt->execute())
			{
				$insertMsg="File Upload Successfully........"; //execute query success message
				header("refresh:3;index.php"); //refresh 3 second and redirect to index.php page
			}
		}
	}
	catch(PDOException $e)
	{
		echo $e->getMessage();
	}
}

?>

i teraz powieliłam dla zdjęcia jeszcze jeden input i dodałam do nazwy 1 -> tzn w input - name="txt_file1", następnie pozostałe wartości które przyjmują od tego input info do wstawienia do bazy

$image_file1	= $_FILES["txt_file1"]["name"];
		$type1		= $_FILES["txt_file1"]["type"];	//file name "txt_file"	
		$size1		= $_FILES["txt_file1"]["size"];
		$temp1		= $_FILES["txt_file1"]["tmp_name"];

to samo z

$insert_stmt->bindParam(':fimage1',$image_file1);

i teraz nie bardzo wiem (czytaj skończyły mi się już pomysły z kombinacjami ;/ ) jak prawidłowo powinno się zrobić

$path1="upload/".$image_file1;

i dalej sprawdzanie czy już taki plik istnieje tu nie wiem jak zrobić po " , " żeby sprawdzał czy istnieje zdjęcie dla każdego z osobna które ma być wgrane

if(!file_exists($path, $path1)

i podanie ścieżki zapisu tu też nie wiem jak powinno się prawidłowo to dodać, zrobiłam tak

move_uploaded_file($temp1, "upload/" .$image_file1);

jak pisałam wcześniej kombinuje już od jakiegoś czasu szukałam na necie ale w większości pokazane jest dla jednego zdjęcia lub przy multi zapisuje na raz ale każde w nowym wierszu a chciała bym to zapisać w jednej tabeli do jednego id nie wiem czy to jasno opisałam no chyba że tak się nie robi to prosiła bym o podpowiedz lub nakierowanie co z czym i jak to powinno się robić.

komentarz 10 marca 2022 przez gatka84 Bywalec (2,150 p.)

Nie wiem czy dobrze rozumiem ale nie chodzi mi o  "input file multiple php" bo w ten sposób wysyłam w jednym input wiele plików ja chce kilka input każdy wysyła file coś takiego

<form method="post" class="form-horizontal" enctype="multipart/form-data">
        <div class="container pt-5">
            <div class="row">
                <div class="col-12">
                    <h1 class="fs-1 mb-3">Blog Creator</h1>
                </div>

                <!-- Autor -->
                <div class="col-12 col-md-6">
                    <div class="floating-form mb-3">
                        <input type="text" name="txt_author" class="form-control" />
                        <label for="">Author</label>
                    </div>
                </div>

                <!-- img Card -->
                <div class="col-12 col-md-6">
                    <div class="floating-form mb-3">
                        <input type="file" name="txt_file" class="form-control" />
                        <label for="">Zdjęcie strona tytułowa</label>
                    </div>
                </div>

                <!-- Tytuł -->
                <div class="col-12 col-md-6">
                    <div class="floating-form mb-3">
                        <input type="text" class="form-control" name="txt_title" />
                        <label for="">Tytuł bloga</label>
                    </div>
                </div>

                <!-- Text Card -->
                <div class="col-12">
                    <div class="floating-form mb-3">
                        <input type="text" name="txt_excerpt" class="form-control" />
                        <label for="">Treść karty</label>
                    </div>
                </div>

                <!-- img -1 -->
                <div class="col-12 col-md-6">
                    <div class="floating-form mb-3">
                        <input type="file" name="txt_file1" class="form-control" />
                        <label for="">Zdjęcie 1 na strone</label>
                    </div>
                </div>

                <!-- p -->
                <div class="col-12">
                    <div class="floating-form mb-3">
                        <textarea type="text" name="txt_content" class="form-control" rows="8"></textarea>
                        <label for="">p</label>
                    </div>
                </div>

                <!-- h2 -->
                <div class="col-12">
                    <div class="floating-form mb-3">
                        <input type="text" name="txt_contenth1" class="form-control" />
                        <label for="">h2</label>
                    </div>
                </div>

                <!-- p -->
                <div class="col-12">
                    <div class="floating-form mb-3">
                        <textarea type="text" name="txt_contentp2" class="form-control" rows="8"></textarea>
                        <label for="">p</label>
                    </div>
                </div>

                <!-- img -->
                <div class="col-12 col-md-6">
                    <div class="floating-form mb-3">
                        <input type="file" name="txt_file2" class="form-control" />
                        <label for="">Zdjęcie 2</label>
                    </div>
                </div>
    </div>
</form>

natomiast nie wiem czy w ten sposób powinno się robić

komentarz 10 marca 2022 przez VBService Ekspert (254,880 p.)

@gatka84, BTW, jeżeli atrybut for elementu <label> jest pusty nie ma potrzeby zapisywać go tak

<label for="">Author</label>

wystarczy tak

<label>Author</label>

 

ale "zalecane" jest "używać" for np.

<input type="text" id="txt_author" name="txt_author" class="form-control" />
<label for="txt_author">Author</label>

 

3 odpowiedzi

+3 głosów
odpowiedź 10 marca 2022 przez SzkolnyAdmin Szeryf (87,220 p.)
Po pierwsze kontrolka formularza musi obsługiwać możliwość przesłania wielu plików na raz. Po drugie skorzystaj z własności tablicy plików, która przesyłasz w ten sposób. Poszukaj: "input file multiple php".
komentarz 10 marca 2022 przez gatka84 Bywalec (2,150 p.)
Ok dzięki za podpowiedz zaraz będę to sprawdzać natomiast nie wiem czy dobrze się rozumiemy ja chcę w osobnych input przesyłać pliki każdy do osobnej komórki (kolumny) ale w jednej lini tak żeby były przypisane do jednego id w tabeli
0 głosów
odpowiedź 10 marca 2022 przez gatka84 Bywalec (2,150 p.)
edycja 10 marca 2022 przez gatka84

ok wykombinowałam tak ale znowu utknęłam tzn

<?php
    $field='txt_file';
    $e=array();
   
        if( $_SERVER['REQUEST_METHOD']=='POST' && isset( $_FILES[ $field ] ) ){
        $obj=$_FILES[ $field ];
        try
	{        
        foreach( $obj["name"] as $index => $void ){
           
            $image_file = $obj["name"][ $index ];
            $type = $obj["type"][ $index ];
            $size = $obj["size"][ $index ];
            $temp = $obj["tmp_name"][ $index ];
                                
				if($size < 5000000) //check file size 1MB
				{
					move_uploaded_file($temp, "upload/" .$image_file); //move upload file temperory directory to your upload folder
				}
				else
				{
					$errorMsg="Your File To large Please Upload 5MB Size"; //error message file size not large than 5MB
				}	
            
    }

w html testuje jak przesłać do bazy kilka input files

 <form method="post" enctype="multipart/form-data">
        <fieldset>
            <legend>Files to upload:</legend>

            <div class="form-group row">
                <label class="col-sm-2 col-form-label">
                    1: <input type="file" class="form-control-file col-sm-10" name="txt_file[1]">
                </label>
            </div>

            <div class="form-group row">
                <label class="col-sm-2 col-form-label">
                    2: <input type="file" class="form-control-file col-sm-10" name="txt_file[2]">
                </label>
            </div>

            <div class="form-group row">
                <label class="col-sm-2 col-form-label">
                    3: <input type="file" class="form-control-file col-sm-10" name="txt_file[3]">
                </label>
            </div>
        </fieldset>
        <button type="submit" class="btn btn-primary" name="upload">Upload</button>
    </form>

i tak wyśle 3 pliki do wskazanego folderu i teraz nie potrafię wymyślić jak zrobić żeby przechwycił przy wysłaniu info o lokalizacji pliku i zapisał go do tabeli każdy do osobnej tabeli w jednym wierszu

i tak w pierwotnym założeniu łapane dane były

$image_file	= $_FILES["txt_file"]["name"];
		$type		= $_FILES["txt_file"]["type"];	//file name "txt_file"	
		$size		= $_FILES["txt_file"]["size"];
		$temp		= $_FILES["txt_file"]["tmp_name"];

a tu nie wiem jak przypisać osobno txt_file1 , txt_file2 itd żeby wiedział który plik gdzie jest no chyba że idę w złą stronę to proszę o podpowiedź.

0 głosów
odpowiedź 11 marca 2022 przez VBService Ekspert (254,880 p.)
edycja 12 marca 2022 przez VBService

Sprawdź ten zapis formularza - naciśnij button upload bez wypełniania i zobacz co zwróci

var_dump($_POST)
var_dump($_FILES)

w odniesieniu do

INSERT INTO blog (blog_date, blog_author, blog_title, blog_excerpt, blog_content, blog_image
  VALUE ...;
<?php
  if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    var_dump($_POST);
    var_dump($_FILES);
  }
?>
<form method="post" enctype="multipart/form-data" class="form-horizontal">
  <div class="container pt-5">
    <div class="row">
      <div class="col-12">
        <h1 class="fs-1 mb-3">Blog Creator</h1>
      </div>
    </div>

    <!-- Autor -->
    <div class="col-12 col-md-6">
      <div class="floating-form mb-3">
        <input type="text" id="txt_author" name="txt_author" class="form-control" />
        <label for="txt_author">Author</label>
      </div>
    </div>

    <!-- Zdjęcie tytułowe -->
    <div class="col-12 col-md-6">
      <div class="floating-form mb-3">
        <input type="file" id="txt_file-1" name="txt_img_file[]" class="form-control" />
        <label for="txt_file-1">Zdjęcie strona tytułowa</label>
      </div>
    </div>

    <!-- Tytuł -->
    <div class="col-12 col-md-6">
      <div class="floating-form mb-3">
        <input type="text" id="txt_title" name="txt_title" class="form-control" />
        <label for="txt_title">Tytuł bloga</label>
      </div>
    </div>

    <!-- Treść karty -->
    <div class="col-12">
      <div class="floating-form mb-3">
        <input type="text" id="txt_excerpt" name="txt_excerpt" class="form-control" />
        <label for="txt_excerpt">Treść karty</label>
      </div>
    </div>

    <!-- Zdjęcie 1 -->
    <div class="col-12 col-md-6">
      <div class="floating-form mb-3">
        <input type="file" id="txt_file-2" name="txt_img_file[]" class="form-control" />
        <label for="txt_file-2">Zdjęcie 1 na strone</label>
      </div>
    </div>

    <!-- Treść paragraf p 1 -->
    <div class="col-12">
      <div class="floating-form mb-3">
        <textarea type="text" id="txt_content-1" name="txt_content[]" class="form-control" rows="8"></textarea>
        <label for="txt_content-1">p</label>
      </div>
    </div>

    <!-- Treść nagłówek h2 -->
    <div class="col-12">
      <div class="floating-form mb-3">
        <input type="text" id="txt_content-2" name="txt_content[]" class="form-control" />
        <label for="txt_content-2">h2</label>
      </div>
    </div>

    <!-- Treść paragraf p 2 -->
    <div class="col-12">
      <div class="floating-form mb-3">
        <textarea type="text" d="txt_content-3" name="txt_content[]" class="form-control" rows="8"></textarea>
        <label for="txt_content-3">p</label>
      </div>
    </div>

    <!-- Zdjęcie 2 -->
    <div class="col-12 col-md-6">
      <div class="floating-form mb-3">
        <input type="file" id="txt_file-3" name="txt_img_file[]" class="form-control" />
        <label for="txt_file-3">Zdjęcie 2 na strone</label>
      </div>
    </div>

    <button type="submit" class="btn btn-primary">Upload</button>
  </div><!-- class="container pt-5" -->    
</form>

 

<?php
  if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    var_dump($_POST);
    var_dump($_FILES['txt_img_file']);
  }
?>
<form method="post" enctype="multipart/form-data" class="form-horizontal">
  <div class="container pt-5">
    <div class="row">
      <div class="col-12">
        <h1 class="fs-1 mb-3">Blog Creator</h1>
      </div>
    </div>
 
    <!-- Autor -->
    <div class="col-12 col-md-6">
      <div class="floating-form mb-3">
        <input type="text" id="txt_author" name="txt_author" class="form-control" />
        <label for="txt_author">Author</label>
      </div>
    </div>
 
    <!-- Zdjęcie tytułowe -->
    <div class="col-12 col-md-6">
      <div class="floating-form mb-3">
        <input type="file" id="txt_file-1" name="txt_img_file[]" class="form-control" />
        <label for="txt_file-1">Zdjęcie strona tytułowa</label>
      </div>
    </div>
 
    <!-- Tytuł -->
    <div class="col-12 col-md-6">
      <div class="floating-form mb-3">
        <input type="text" id="txt_title" name="txt_title" class="form-control" />
        <label for="txt_title">Tytuł bloga</label>
      </div>
    </div>
 
    <!-- Treść karty -->
    <div class="col-12">
      <div class="floating-form mb-3">
        <input type="text" id="txt_excerpt" name="txt_excerpt" class="form-control" />
        <label for="txt_excerpt">Treść karty</label>
      </div>
    </div>
 
    <!-- Zdjęcie 1 -->
    <div class="col-12 col-md-6">
      <div class="floating-form mb-3">
        <input type="file" id="txt_file-2" name="txt_img_file[]" class="form-control" />
        <label for="txt_file-2">Zdjęcie 1 na strone</label>
      </div>
    </div>
 
    <!-- Treść paragraf p 1 -->
    <div class="col-12">
      <div class="floating-form mb-3">
        <textarea type="text" id="txt_content-1" name="txt_content[]" class="form-control" rows="8"></textarea>
        <label for="txt_content-1">p</label>
      </div>
    </div>
 
    <!-- Treść nagłówek h2 -->
    <div class="col-12">
      <div class="floating-form mb-3">
        <input type="text" id="txt_content-2" name="txt_content[]" class="form-control" />
        <label for="txt_content-2">h2</label>
      </div>
    </div>
 
    <!-- Treść paragraf p 2 -->
    <div class="col-12">
      <div class="floating-form mb-3">
        <textarea type="text" d="txt_content-3" name="txt_content[]" class="form-control" rows="8"></textarea>
        <label for="txt_content-3">p</label>
      </div>
    </div>
 
    <!-- Zdjęcie 2 -->
    <div class="col-12 col-md-6">
      <div class="floating-form mb-3">
        <input type="file" id="txt_file-3" name="txt_img_file[]" class="form-control" />
        <label for="txt_file-3">Zdjęcie 2 na strone</label>
      </div>
    </div>
 
    <button type="submit" class="btn btn-primary">Upload</button>
  </div><!-- class="container pt-5" -->    
</form>

 

i wtedy dla blog_content np. gdy na stronie ma być jako jeden blok html

    $content_post = $_POST['txt_content'] ?? null;
    if ($content_post) {
      $content = $element = '';
      for ($i=0; $i<count($content_post); $i++) {
        $element = ($i == 1) ? 'h2':'p';
        $content .= "<{$element}>{$content_post[$i]}</{$element}>";
      }
    }

    ...

    $insert_stmt->bindParam(':fcontent',$content);

 

lub gdy ma być łączone z innym html-em

    $content_post = $_POST['txt_content'] ?? null;
    if ($content_post)
      $content = implode('|', $content_post);
 
...
 
$insert_stmt->bindParam(':fcontent',$content);

w trakcie pobierania danych z bazy danych

$sql = "SELECT * FROM blog WHERE ...";
$result = $conn->query($sql);
$row = $result->fetch_assoc();

$blog_html = '<p><span class="date">'.$row['blog_date'].'</span> '.$row['blog_author'].'</p>';

...

$content = explode('|', $row['blog_content']);
$p_1 = $content[0];
$h2  = $content[1];
$p_2 = $content[2];
$blog_html .= '<div class="content">
                 <div>Lorem ...</div>
                 <p>'.$p_1.'</p>
                 <div>Lorem ...</div>
                 <h2>'.$h2.'</h2>
                 <p>'.$p_2.'</p>
               <div>';

 

a dla blog_image

<?php
  if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    //... tu dane z $_POST;

    $img_file_post = $_FILES['txt_img_file'] ?? null;
    if ($img_file_post) {
      $allowed_type = ['image/jpg', 'image/jpeg', 'image/png', 'image/webp'];
      $errorMsg = [];
      $image_file = '';     

      for ($i=0; $i<3; $i++) {
        if ($img_file_post['name'][$i] !== '') {
          if (in_array($img_file_post['type'][$i], $allowed_type)) {
            if ($img_file_post['size'][$i] < 5000000) {
              $path = 'upload/'.$img_file_post['name'][$i];
              if (!file_exists($path)) {
                if (move_uploaded_file($img_file_post['tmp_name'][$i], $path)) {
                  $image_file .= $img_file_post['name'][$i].'|';
                }
              } else {
                $errorMsg[] = 'File number '.($i+1).' already exists... Check upload folder';
              }
            } else {
              $errorMsg[] = 'Your file number '.($i+1).' to large, please upload up to 5MB size';
            }
          } else {
            $errorMsg[] = 'Upload JPG, JPEG, PNG & WEBP file formate... Check Extension for file number '.($i+1);
          }
        }
      }

      $image_file = rtrim($image_file, '|');
      if ($errorMsg) printf(implode('<br>', $errorMsg));     
    }

    ...

    $insert_stmt->bindParam(':fimage',$image_file);  
  }
?>

 

ewentualna dalsza pomoc w komentarzach, bo teraz kolejny krok jest z Twojej strony (bo może wiesz co z tym dalej zrobić, jak oczywiście ten koncept Tobie się spodoba). smiley

komentarz 14 marca 2022 przez VBService Ekspert (254,880 p.)

BTW, tu i tu teżwink

(in_array ($img1, $image_file))

brakuje na początku if-a

if (in_array ($img1, $image_file)) { ...

 

komentarz 14 marca 2022 przez VBService Ekspert (254,880 p.)

=== $img1 <-- nie będzie równy

BTW, operator === (strict equality) to

strict equality

 

The strict equality operators (=== and !==) use the Strict Equality Comparison Algorithm to compare two operands.

  • If the operands are of different types, return false.
  • If both operands are objects, return true only if they refer to the same object.
  • If both operands are null or both operands are undefined, return true.
  • If either operand is NaN, return false.
  • Otherwise, compare the two operand's values:
    • Numbers must have the same numeric values. +0 and -0 are considered to be the same value.
    • Strings must have the same characters in the same order.
    • Booleans must be both true or both false.
komentarz 14 marca 2022 przez VBService Ekspert (254,880 p.)
edycja 14 marca 2022 przez VBService

Ten kod nawet po poprawieniu błędów składni

<script>
var element = document.getElementById("txt_file-1").value;
// element zawiera wartość typu string więc musisz użyć " np. cudzysłowy
if (element == "<?php echo $img1?>") {
    <?php 
     
        if (in_array ($img1, $image_file)) {
          $index = array_search( $img1, $image_file);
          $image_file[$index] = $img_file_post['name'][$index];
          $path = 'upload/' .$img1;
          unlink($path);
        } 
    ?>
}
</script>

po wykonaniu się kodu php i zwróceniu zawartości do przeglądarki, będzie wyglądał mniej więcej tak

<script>
  var element = document.getElementById("txt_file-1").value;
  // załóżmy, że w $img1 był łańcuch tekstowy np. taki obrazek123.png
  if (element == "obrazek123.png") {
  }
</script>

 

komentarz 14 marca 2022 przez VBService Ekspert (254,880 p.)
edycja 14 marca 2022 przez VBService

Czy możesz mieć taki koncept kolumn w tabeli w bazie danych?

INSERT INTO blog (
   blog_id,
   blog_date,
   blog_author,
   blog_title,
   blog_excerpt,
   blog_contentp1,
   blog_contenth1,
   blog_contentp2,
   blog_image1,
   blog_image2,
   blog_image3
) VALUE (...);

to by mogło uprościć ewentualne uaktualnianie choćby obrazków.

komentarz 14 marca 2022 przez gatka84 Bywalec (2,150 p.)
taki mam bazowy wygląd kolumn w bazie ale przy takim układzie nie potrafiłam usunąć "update" danego zdjęcia jeśli to było jedno z kilku zapisanych w danym wierszu dlatego spróbowałam twojej propozycji i przy okazji sporo się ucząc i teraz tak podany przez ciebie układ kolumn mam cały czas po prostu obecnie wszystkie zdjęcia były ładowane blog_image

a przy takim układzie jest prostszy sposób na edycje, ew usunięcie jak w przerabianym przykładzie gdzie trafiłam na ścianę

Podobne pytania

0 głosów
0 odpowiedzi 123 wizyt
0 głosów
2 odpowiedzi 433 wizyt
pytanie zadane 14 maja 2020 w PHP przez spicedagger Użytkownik (530 p.)
0 głosów
2 odpowiedzi 518 wizyt
pytanie zadane 17 kwietnia 2022 w PHP przez molik Użytkownik (950 p.)

92,770 zapytań

141,695 odpowiedzi

320,518 komentarzy

62,107 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

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!

...