Выберите столбец mysql (который является массивом), где определен другой столбец: - и вставьте его в переменную php

0

У меня есть два столбца в базе данных: - copy (который является массивом) и bookid. Мой код;

$query = mysqli_query($db, "select copy from book_outward WHERE bookid like 'B1'");
while ($row = mysqli_fetch_array($query)) {
    $copyid = $row['copy'];
}

База данных выглядит так:

+----------------+
| id copy bookid |
+----------------+
| 1  1    B1     |
| 2  2,3  B1     |
| 3  4    B1     |
| 4  2    B2     |
+----------------+

но он сохраняет только последние значения, которые были введены в "B1". Я также пробовал

$copyid[] = $row['copy'];

но в этом случае я должен каждый раз менять ключи массива вручную.

Моя цель состоит в том, чтобы вставить copy into column bookid='B1' и прежде чем он должен убедиться, что в базе данных для B1 могут быть сохранены только значения UNIQUE.

HTML: -

<input type="text" name="bookid" />
<input type="text" name="copies[]" />

PHP-код для вставки: -

$book_id = $_POST['bookid']; 
$copies = implode(',',$_POST['copies']);
$result = mysqli_query($db, "insert into book_outward(bookid,copy) values ('$book_id','$copies')");
  • 0
    какой тип данных для копий в вашей БД?
  • 0
    Тип данных @suresh - "VARCHAR"
Показать ещё 12 комментариев
Теги:
arrays

3 ответа

1
Лучший ответ

Как говорится в некоторых комментариях, это не лучший способ, но это возможно.

Вы можете получить все copyid данных:

$query = mysqli_query($db, "select copy from book_outward WHERE bookid like 'B1'");
$copyid = "";
while ($row = mysqli_fetch_array($query)) {
    $copyid .= $row['copy'] . ",";
}
$copyidsFromDB = explode(",",rtrim($copyid , ','));

После этого вы можете проверить, есть ли то, что вы получили в запросе, используя array_intersect:

$copies = $_POST['copies']
// if not an array use: $copies = explode(",", $_POST['copies'])
if (count(array_intersect($copies, $copyidsFromDB) == 0) 
    // insert to DB
  • 0
    Благодарю. Много справки, но последний шаг "count (array_intersect)" не работает. он не проверяет дубликаты значений в обоих массивах. Будет очень полезно, если пересекающаяся часть также начнет работать.
  • 0
    Решил сам, добавив только одну строку: $copies2 = explode(",",rtrim($copies , ',')); before array_intersect Спасибо, код очень помогает.
Показать ещё 1 комментарий
0

Решил сам, добавив только одну строку

'$copies2 = explode(",",rtrim($copies , ','));'

перед array_intersect Благодаря коду очень помогает.

0

Таким образом, мне кажется, что проблема заключается в том, что исходная схема DB данных имеет некоторые проблемы.

SQL-подобная БД не является отличным местом для размещения значения стиля "массив". У этого уже есть механизм для этого: таблица ссылок.

Это избавит вас от необходимости вручную перетасовывать ваши первичные ключи в этой таблице. Это проще проверить и проверить.


Если вы хотите сделать это с помощью php-кода, например, у вас нет доступа SQL, например, в контролируемой среде сборки, вы должны использовать "строковые ключи" для вашего $ copyid (переименование подсказки в $ copyidmap) до группироваться вместе как части данных и сохранять ключевые отношения. поэтому следующее будет уникальным: map-> {bookId} → {copyid} → {id}//Где id - это идентификатор первичной таблицы. Очевидно, проверять и выполнять ваши неопределенные назначения массива.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню