Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Импортиране на снимка в база данни, чрез php

Featured Replies

Създадох форма, чрез html, css и php, в която се въвежда текст и може да се прикачи снимка. Проблемът ми е, че не разбирам от php, и не успявам да се справя с проблема. Искам, когато някой прикачи снимка, тя да се запазва в папка. Текста се визуализира в базата данни. Търсих и пробвах, различни варианти, но не успявам. Споделям кода и ще се радвам, ако някой помогне.

      <div class="container-form">
         <form action="upload.php" method="post" enctype="multipart/form-data">
            <div class="name">
               Имена:<br>
               <input type="text" name="name" value="" size="40"  />
            </div>
            <br>
            <div class="image">
               Прикачете ваша снимка! (максимален размер 20МБ)<br>
               <input type="file" name="image" id="image" size="40" accept="image/*"  />
            </div>
            <br>
            <div class="phone">
               Телефон:<br>
               <input type="tel" name="phone" value="" size="40"  />
            </div>
            <br>
            <div class="email">
               Имейл адрес:<br>
               <input type="email" name="email" value="" size="40"  />
            </div>
            <div class="submit">
               <input type="submit" name="submit" value="Изпращане" id="submit" />			
            </div>
         </form>
      </div>
<?php
// Connect to MyQSL
$link = mysqli_connect("localhost", "root", "", "my_form");

$link->query("SET NAMES 'UTF8'");

// Check our connection
if ($link === false)
{
    die("ERROR: Could not connect. " . mysqli_connect_error());
}

$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["image"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

// Check if file already exists
if (file_exists($target_file)) {
    echo "Съжаляваме, файлът вече съществува.";
    $uploadOk = 0;
}

// Check file size
if ($_FILES["image"]["size"] > 20000000) {
    echo "Съжалявамe, файлът ви е твърде голям.";
    $uploadOk = 0;
}

// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" ) {
    echo "За съжаление са разрешени само файлове от тип изображение, JPG, JPEG или PNG.";
    $uploadOk = 0;
}

if(isset($_POST["submit"])) {
	
}

// Escape user inputs for security
$name = mysqli_real_escape_string($link, $_REQUEST['name']);
$image_name = mysqli_real_escape_string($link, $_REQUEST['image']);
$image = file_get_contents($image_name);
$phone = mysqli_real_escape_string($link, $_REQUEST['phone']);
$email = mysqli_real_escape_string($link, $_REQUEST['email']);

// Insert our data
$sql = "INSERT INTO form (name, image, phone, email) VALUES ('$name', '$image', '$phone', '$email')";
// Print response from MyQSL
if (mysqli_query($link, $sql))
{
    echo "<div class='echo-complete'> <div class='echo-text'> Формата беше приета успешно. Благодарим ви.</div></div><br>";
}
else
{
    echo "<div class='echo-error'> <div class='echo-text'> ГРЕШКА: Не може да се изпълни $sql.</div></div><br>" . mysqli_error($link);
}

// Close our connection
mysqli_close($link);
?>

Моля, не ми споделяйте линкове, от типа "тук е описано" и прочие. Не го разбирам толкова този php, но се налага да го използвам. 🙂

Първо, заглавието на темата и кода казват различни неща. Искаш да качиш снимката директно в базата данни (mysql) или по разумният начин в базата данни да съхраняваш само името на файла и/или директорията, а самият файл да си е на сървъра? 

В началото взимаш правилно информация за качения файл и после в някакъв опит за валидация правиш това:

$_REQUEST['image']   - Може да направиш var_dump($_REQUEST); да видиш, че няма такова нещо... После може да разгледаш по същият начин $_FILES, променливата, която трябва да ползваш.

Набързо ще ти дам примери за двата начина спрямо твоя код, за да не чакаш отговор.

      1. Качване на файла в сървъра със запазване на информация за него в БД

Просто добави това и трябва да качи файла в папката images (ако я няма ще даде грешка).

$newFileName = $_FILES['image']['name'];
$dest_path = __DIR__ . "/images/" . $newFileName;
if(move_uploaded_file($_FILES["image"]["tmp_name"],$dest_path)){
  echo "Успешно.";
}

и по-долу вместо това:

$image_name = mysqli_real_escape_string($link, $_REQUEST['image']);

$image = file_get_contents($image_name);

слагаш това:

$image =  $newFileName;

или заместваш директно в sql. Това ще качи името на файла в базата данни.

От теб зависи да направиш валидация, че името на файла не е същото като на вече качен файл. Като цяла просто вземи разширението на файла и генерирай уникално име...Имам предвид и валидация на всичко друго, защото липсва.

     2. Ако искаш да буташ всичко в БД

$image_base64 = base64_encode(file_get_contents($_FILES['image']['tmp_name']) );
$image = 'data:image/'.$imageFileType.';base64,'.$image_base64;

Това по-горе ще конвертира снимката в base64 и ще запази всичко в променливата $image, съдържанието на която трябва да качиш в БД. 

Премахваш тея редове:

$image_name = mysqli_real_escape_string($link, $_REQUEST['image']);
$image = file_get_contents($image_name);

За да може после да качиш $image от по-горе.

👉 !!! Изисква много място и ще има проблеми с големи файлове (от лимита в php.ini). Колоната image където ще съхраняваш самата снимка, трябва да е най-малко от тип text, най-добре longtext.

И за да покажеш снимката:

Взимаш съдържанието на image в таблицата "form" и го слагаш в променлива, примерно $image_src:

<img src='<?php echo $image_src; ?>' >

Това е "тъпо", дано имаше предвид първия начин. Успех.

  • Автор

Заглавието ми е неправилно, но както съм написал в публикацията искам да се качва в папка на сървъра.

След направените промени, снимката се качва на сървъра, но явно пропускам нещо, защото името на файла, не се изписва в базата данни. Може да са ми грешни параметрите на колоните в базата данни: image: BLOB; image_name: varchar(64) или не добавям нещо. 🤔

Ами да... За какво е този BLOB като няма да качваш самата снимка в БД, нито кода е подходящ за BLOB...

Може да използваш image_name като замениш това:

$sql = "INSERT INTO form (name, image, phone, email) VALUES ('$name', '$image', '$phone', '$email')";

с това:

$sql = "INSERT INTO form (name, image_name, phone, email) VALUES ('$name', '$image', '$phone', '$email')";

Сега ако image не може да е празно ще има грешка...

 

 

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.