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

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

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

     

Коригиране на релационна таблица?


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


Здравейте,

Имам проблем, с който се мъча от много време - Имам 2 таблици с данни, като за връзка между двете използвам релационна таблица, съдържаща просто уникалните ключове на закачените записи.

Пример: таблица 1 съдържа новини /row_id/, таблица 2 съдържа тагове /tag_id/ и релационната таблица съдържа в себе си записи за всеки закачен таг към всяка публикация.

Да, но при редактиране на публикация искам например да сменя таговете - как обаче да сравня и заменя (изтрия и добавя) разликите? Пробвах следния начин, но не сработва винаги:

<?php
    $old_selection = array( ... );
    $new_selection = array( ... );

    if ($old_selection != $new_selection) {
        $to_delete = array_diff($old_selection, $new_selection);
        if (!empty($to_delete)) {
            foreach ($to_delete as $del) {
                mysqli_query($conn, "DELETE FROM table_rel WHERE row_id = row_id AND tag_id = $del");   
            }
        }
        $to_add = array_diff($new_selection, $old_selection);
        if (!empty($to_add)) {
            foreach ($to_add as $add) {
                mysqli_query($conn, "INSERT INTO table_rel (tag_id, row_id) VALUES ($add, row_id)");   
            }
        }
    }
?>

Някакви предложения да имате? :/

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

Такива неща се правят, като просто изтриваш всички стари записи и записваш всичко наново.

$row_id = ... // това трябва да е id-to на реда
mysqli_query("DELETE FROM table_rel WHERE row_id = $row_id");
foreach ($new_selection as $tag_id) {
	mysqli_query("INSERT INTO table_rel(tag_id, row_id) VALUES($tag_id, $row_id)");
}

 

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

Такива неща се правят, като просто изтриваш всички стари записи и записваш всичко наново.

$row_id = ... // това трябва да е id-to на реда
mysqli_query("DELETE FROM table_rel WHERE row_id = $row_id");
foreach ($new_selection as $tag_id) {
	mysqli_query("INSERT INTO table_rel(tag_id, row_id) VALUES($tag_id, $row_id)");
}

 

Всъщност този метод ми е до болка познат, но въпреки всичко исках да разбера дали има друг начин, понеже искам максимално да "олекотя" конекциите до базата с данни...

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

Няма какво да се олекотяват. Определено еднo DELETE e по-добре и по-бързо от няколко. Колкото е по-малък броя на извикване на mysqli_query толкова по-добре.

А горният код е малко или много безмислен. DELETE заявките изтриват таговете за всички row_id редове защото row_id = row_id e винаги вярно. Тия INSERT заявки 100% дават грешка защото имаш някакво row_id във VALUES, което трябва да е реaлна стойност, а не име.

Впрочем, ако искаш малко повече оптимизация, записването може да се направи с INSERT на множество от редове. Става като след VALUES се въведат много редове разделени със запетая. Потърси в интернет за точния синтаксис, ако не съм обяснил достатъчно ясно.

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

Разгледай какво е foreign key cascade


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

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

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

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

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

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

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

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

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

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

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

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

    • от Tomas07
      Създадох форма, чрез 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, но се налага да го използвам. 🙂
    • от streleca_stz
      Здравейте,
      От известно време насам се опитвам да използвам различни вариации на websocket-и, но изпадам в един и същи казус - подкарване под криптирана SSL връзка. Разбирам, че трябва връзката да минава през wss:// и да имам активен сертификат, но... но до там, каквото и да се опитвам да правя, то все не иска да тръгне (вади грешка за опит за несигурна връзка). Търсих редица решения на проблема ми и повечето решения са от сорта на - въведете към конфигурацията самите файлове на сертификата и всичко ще е наред. Да, но аз използвам Let's Encrypt, който се обновява на всеки 90 дни... мога ли да влизам в кода на интервал от време, за да сменям пътищата до сертификата при всяко ново генериране.
      Та въпросът ми е някой от вас сблъсквал ли се е като цяло с уеб сокети и подкарването им с Let's Encrypt?
    • от tovamieimeto98
      Добър вечер.
      Въпросът ми не свързан с някаква програма.
      Занимавам се с програмиране от около година. Насочил съм се към web development, по - скоро php web dev.
      Знам това - онова(php функции, OOP), владе малко бази данни(mySql), html/css и малко js/jquery. Имам също и няколко проекта, общо взето CRUD, регистрации, логвания, коментари, тн... Общи неща.
      Въпросът е, че вече искам да започна като junior или стажант някъде, но не съм сигурен дали съм готов. Може ли някой запознат да ми разясни горе - долу как стоят нещата, на кое да наблегна, кое да науча.
      Благодаря 
    • от мен
      Как да транспонирам таблица с формули, т.е. без да използвам контекстно меню или клавишни комбинации?
      Трябва ми бърз начин за таблица от порядъка на 100х100 клетки. Размножаването на формули е много неадекватно, поне аз не виждам при транспониране как да го накарам да следва правилната логика.
    • от Petar02
      Здравейте,
      Имам за задача да създам база данни за мобилен оператор. Какъв вид заявка или отчет или таблица трябва да създам, с която всеки месец да се създава автоматична фактура с дължима сума според определени критерии (на какъв вид план си и каква трябва да бъде месечната ти такса). И също какъв вид форма трябва да направя, за да се плаща тази фактура.
      Благодаря предварително за оказаното съдействие.
  • Дарение

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

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите Условия за ползване