У меня есть таблица базы данных, подобная этой
Id user_id folder product_ids
1 4 test1 2,3,4 2 4 test2 7,8,9 3 4 test3 10,11,12
Здесь я сохранил идентификаторы продуктов, разделенные запятыми. Пользователи создали свои папки, подобные этому, и хотели переместить один или несколько продуктов в другую папку. Скажем, если пользователь хочет, чтобы он мог выбрать идентификатор продукта (8) и переместить его из test2 в test3, и набор результатов будет выглядеть так:
Id user_id folder product_ids
1 4 test1 2,3,4 2 4 test2 7,9 3 4 test3 10,11,12,8
Как я могу это сделать с помощью sql и php?
К сожалению, у MySQL нет встроенного REPLACE REGEX 🙁
ПРИМЕЧАНИЕ .
Обновите PRODUCT_TABLE по имени таблицы.
Вот решение:
<? /** * @param String $folderSrc * @param String $folderDst * @param String $movedProductIds * @param String $userId * @return String Built SQL Query */ function buildSqlQueryMoveProductId ($folderSrc, $folderDst, $movedProductIds, $userId) { return "UPDATE PRODUCT_TABLE SET PRODUCT_IDS = CASE WHEN FOLDER = '" . $folderSrc . "' THEN (REPLACE (REPLACE (REPLACE (PRODUCT_IDS, '," . $movedProductIds . "', ''), '" . $movedProductIds . ",', ''), '" . $movedProductIds . "', '')) WHEN FOLDER = '" . $folderDst . "' THEN (CONCAT (IF (LENGTH(PRODUCT_IDS) > 0, CONCAT (PRODUCT_IDS, ','), '' ), '" . $movedProductIds . "')) ELSE PRODUCT_IDS END WHERE USER_ID = " . $userId; } // Example print moveProductId ('test1', 'test2', '3', 4);
Старайтесь не хранить значения, разделенные запятыми, в одном столбце. MySQL может отлично обрабатывать большие таблицы, поэтому вы можете вводить каждый идентификатор продукта в отдельную строку.
Вы также можете создать несколько таблиц, например, сохранить данные папки. Затем в другой таблице могут храниться первичные ключи таблицы папок, а также идентификаторы продуктов и идентификатор пользователя.
Чем больше вы храните в одной таблице, тем менее организованной она становится. Я не уверен, что лучше всего по производительности, но организация является ключевым, особенно позже.
РЕДАКТИРОВАТЬ:
Итак, скажем, вы создаете таблицу следующим образом:
ID User_ID Folder Product_ID 1 4 test1 2 2 4 test2 7 3 4 test3 10
Теперь вы можете просто найти Product_ID и ОБНОВИТЬ имя папки. Поэтому, когда вы передаете идентификатор продукта на сценарий обновления, вы можете использовать запрос примерно так:
UPDATE your_table_name SET Folder = :folder WHERE Product_ID = :pid
Затем привяжите имя папки и идентификатор продукта. Пожалуйста, прочтите это о PDO, если вы не знакомы с подготовленными заявлениями. Я бы рекомендовал привязать значения, так как вы говорите о вводе пользователя, который всегда можно манипулировать, что может привести к возможному нарушению безопасности.
<?php /*Fetch your product ids and you will return sting of ids like "1,2,3,4,5,6,7" * */ // product Ids. From where you want to remove id $productOne="1,2,3,4,5"; // product Ids, From where you want to put id $productTwo="6,7,8,9"; //product 1 array $productOneArray=explode(",",$productOne); //product 2 array $productTwoArray=explode(",",$productTwo); //Id which you want to change $movingId = "5"; //Let's remove your product. foreach ($productOneArray as $key=>$id){ if($id == $movingId){ unset($productOneArray[$key]); } }//BINGO !! you remove your id //Add it to another product ids array_push($productTwoArray,$movingId); //Bingo You did it //now turn both into string $productOne=implode(",",$productOneArray); $productTwo=implode(",",$productTwoArray); //Update both the values in database ?>
с<?php /*Fetch your product ids and you will return sting of ids like "1,2,3,4,5,6,7" * */ // product Ids. From where you want to remove id $productOne="1,2,3,4,5"; // product Ids, From where you want to put id $productTwo="6,7,8,9"; //product 1 array $productOneArray=explode(",",$productOne); //product 2 array $productTwoArray=explode(",",$productTwo); //Id which you want to change $movingId = "5"; //Let's remove your product. foreach ($productOneArray as $key=>$id){ if($id == $movingId){ unset($productOneArray[$key]); } }//BINGO !! you remove your id //Add it to another product ids array_push($productTwoArray,$movingId); //Bingo You did it //now turn both into string $productOne=implode(",",$productOneArray); $productTwo=implode(",",$productTwoArray); //Update both the values in database ?>
Если вам нужна дополнительная помощь на хинди или гуджрати, вы можете спросить меня.
Если вы хотите переместить несколько идентификаторов
<?php $name="parag"; if($name=="parag"){ echo uniqid().$name; } ?> <script> $("div").css("width", "100px"); $("div").css("height", "100px"); </script> <?php echo "<pre>"; /*Fetch your product ids and you will return sting of ids like "1,2,3,4,5,6,7" * */ // product Ids. From where you want to remove id $productOne="1,2,3,4,5"; // product Ids, From where you want to put id $productTwo="6,7,8,9"; //product 1 array $productOneArray=explode(",",$productOne); //product 2 array $productTwoArray=explode(",",$productTwo); //Id which you want to change $movingId = "2,3,4"; $movingIdArray = explode(",", $movingId); //Let's remove your product. foreach($movingIdArray as $movingIds){ foreach ($productOneArray as $key=>$id){ if($id == $movingIds){ unset($productOneArray[$key]); } }//BINGO !! you remove your id } print_r($productOneArray); //Add it to another product ids array_push($productTwoArray,$movingId); //Bingo You did it //now turn both into string $productOne=implode(",",$productOneArray); $productTwo=implode(",",$productTwoArray); //Update both the values in database echo "productOne = ".$productOne."<br />"; echo "productTwo = ".$productTwo."<br />"; ?>
с<?php $name="parag"; if($name=="parag"){ echo uniqid().$name; } ?> <script> $("div").css("width", "100px"); $("div").css("height", "100px"); </script> <?php echo "<pre>"; /*Fetch your product ids and you will return sting of ids like "1,2,3,4,5,6,7" * */ // product Ids. From where you want to remove id $productOne="1,2,3,4,5"; // product Ids, From where you want to put id $productTwo="6,7,8,9"; //product 1 array $productOneArray=explode(",",$productOne); //product 2 array $productTwoArray=explode(",",$productTwo); //Id which you want to change $movingId = "2,3,4"; $movingIdArray = explode(",", $movingId); //Let's remove your product. foreach($movingIdArray as $movingIds){ foreach ($productOneArray as $key=>$id){ if($id == $movingIds){ unset($productOneArray[$key]); } }//BINGO !! you remove your id } print_r($productOneArray); //Add it to another product ids array_push($productTwoArray,$movingId); //Bingo You did it //now turn both into string $productOne=implode(",",$productOneArray); $productTwo=implode(",",$productTwoArray); //Update both the values in database echo "productOne = ".$productOne."<br />"; echo "productTwo = ".$productTwo."<br />"; ?>
Почему вы не используете json_encode () при добавлении product_ids. Когда вы вставляете идентификатор продукта, просто закодируйте его и сохраните. & во время перемещения из папки читайте, что json и декодирует его. Добавьте или удалите соответствующие идентификаторы из json, затем снова сохраните в базе данных
Вы получили ответы о том, как это сделать с помощью php-кода. Но вы действительно должны нормализовать свою базу данных. Нормализованная база данных содержит только таблицы, в которых каждая таблица содержит данные, описывающие определенный объект, и относится к другим объектам через внешние ключи. Вы уже сделали это, подключив свои пользовательские данные через внешний ключ «user_id», теперь переходите и реорганизуйте свою таблицу в другие папки «папка» и «продукт».
Ваша окончательная схема может выглядеть так:
Пользователи таблицы
user_id user_name etc.
Настольные папки
folder_id folder_name user_id etc.
Настольные продукты
product_id folder_id product_name etc.
При этом, чтобы переместить продукт из одной папки в другую, просто измените файл folder_id записи из таблицы продуктов. Чтобы получить все продукты из одной папки, вы используете соединения:
SELECT folders.*, products.* from products JOIN folders on folders.folder_id = products.folder_id WHERE folders.folder_id = your_desired_folder_id
Узнайте больше о нормализации базы данных с большим количеством примеров и причин, почему это необходимо (несмотря на проблемы, с которыми вы уже сталкиваетесь): http://www.dbnormalization.com/
С уважением, jojo