Премини към съдържанието
  • Добре дошли!

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

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

     

Tomas07

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

Препоръчан отговор


Създадох форма, чрез 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 не може да е празно ще има грешка...

 

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Благодаря много за помощта! Всичко работи нормално. 🙂


Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Добавете отговор

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

Гост
Напишете отговор в тази тема...

×   Вмъкнахте текст, който съдържа форматиране.   Премахни форматирането на текста

  Разрешени са само 75 емотикони.

×   Съдържанието от линка беше вградено автоматично.   Премахни съдържанието и покажи само линк

×   Съдържанието, което сте написали преди беше възстановено..   Изтрий всичко

×   You cannot paste images directly. Upload or insert images from URL.


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

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

  • Подобни теми

    • от streleca_stz
      Здравейте,
      От известно време насам се опитвам да използвам различни вариации на websocket-и, но изпадам в един и същи казус - подкарване под криптирана SSL връзка. Разбирам, че трябва връзката да минава през wss:// и да имам активен сертификат, но... но до там, каквото и да се опитвам да правя, то все не иска да тръгне (вади грешка за опит за несигурна връзка). Търсих редица решения на проблема ми и повечето решения са от сорта на - въведете към конфигурацията самите файлове на сертификата и всичко ще е наред. Да, но аз използвам Let's Encrypt, който се обновява на всеки 90 дни... мога ли да влизам в кода на интервал от време, за да сменям пътищата до сертификата при всяко ново генериране.
      Та въпросът ми е някой от вас сблъсквал ли се е като цяло с уеб сокети и подкарването им с Let's Encrypt?
    • от BG Telekom
      Здравейте,
      От два дена се занимавам със следният казус:
      В нашата съвсем малка организация имаме един компютър (ще го наричам сървър, понеже са ползва само като такъв), върху който сме пуснали AirControl и Cacti, сътответно с httpd и mysqld. Драмата стана, когато дискът на сървъра се запълни с огромно количесто логове и трябваше да се изтрият тези от mysql, за да освободим място. След това обаче httpd и mysqld не можеха да се стартират поради ред грешки. Преди да отстраня този проблем доста се поизпотих, но накрая реших проблема като update-нах двете услуги с service update httpd и service update mysql-server. Вече имам нормален достъп до Cacti през локалният IP адрес, но естествено не мога да се логна, защото mysql е ъпдейтнат и най - вероятно са се загубили логин файловете.
      Та въпроса ми е. Може ли да се свържат отново Cacti и MySQL, като се запазят/възвърнат данните, които бяха въведени в Cacti преди този проблем? Ползвахме го за мониторинг на рутери и имахме около 100 записа в него.
      При необходимост мога да предоставя лог файлове.
      Благодаря предварително!
       
      Поздрави,
      Борис Недялков.
    • от tovamieimeto98
      Добър вечер.
      Въпросът ми не свързан с някаква програма.
      Занимавам се с програмиране от около година. Насочил съм се към web development, по - скоро php web dev.
      Знам това - онова(php функции, OOP), владе малко бази данни(mySql), html/css и малко js/jquery. Имам също и няколко проекта, общо взето CRUD, регистрации, логвания, коментари, тн... Общи неща.
      Въпросът е, че вече искам да започна като junior или стажант някъде, но не съм сигурен дали съм готов. Може ли някой запознат да ми разясни горе - долу как стоят нещата, на кое да наблегна, кое да науча.
      Благодаря 
    • от c3p0
      Ще създам нова MySQL база данни и се чудя кой от многото възможни енкодинги да избера като най-подходящ за кирилица.
      Преди съм бил създал една MySQL база данни с енкодинг: utf8_swedish_ci;
      Преди съм бил създал една MySQL база данни с енкодинг: utf8_general_ci;
      Кой от двата енкодинга е подходящ за кирилица или пък някой друг е по-подходящ?
         
    • от PopPop
      Здравейте!
      Имам нужда от малка консултация. Мой близък започна да се занимава с програмиране и съвсем в началото, с акцент върху PHP и JS. Има проблем с решаването на няколко задачи и реших да потърся помощ тук при вас. Предполагам, че няма да отнеме повече от 2-3 часа и разбира се ще заплатя за услугата. Подробностите можем да уточним на лични. Благодаря за отговорите предварително!
  • Дарение

×
×
  • Добави ново...