PHP в MYSQL - Поместить массив PHP в таблицу MYSQL и периодически обновлять его? - PullRequest
0 голосов
/ 27 ноября 2011

Извините, если на этот вопрос ответили, но если на него уже отвечали, я нигде не могу его найти. Итак, с самого начала. Допустим, у меня был стол member, и я хочу сохранить в нем, каковы их главные интересы. Есть $row, у которого есть все обычные вещи для их идентификации userID и password и т. Д., И у меня было еще 3 столбца, которые были помечены top3_1, top3_2 & top3_3, чтобы поставить каждый из них интересует в форме сообщения.

Если бы вместо этого я хотел сохранить эти данные в виде массива PHP (используя 1 столбец вместо 3), есть ли способ сохранить их как читаемые данные при открытии PHPmyadmin?

В настоящий момент все, что он говорит, это массив, и когда я перезваниваю его обратно в браузер (скажем, на странице, где они могут просмотреть и обновить свои интересы), он отображает «a» как top3_01, «r», как top3_02 и «r». 'как top3_03 (при каждом размещении то, что было бы' массивом ', как показано в таблице, если было 5 результатов. Кто-нибудь знает, что я имею в виду?

Например:

Если бы у нас была форма, в которой собраны три главных интереса, которые нужно поместить в таблицу с именем users,

<form action="back_to_same_page_for_processing.php" method="post" enctype="multipart/form-data">

     <input name="top3_01" type="text" value="enter interest number 1 here" />
     <input name="top3_02" type="text" value="enter interest number 2 here" />
     <input name="top3_03" type="text" value="enter interest number 3 here" />
     <input type="submit" name="update_button" value=" Save and Update! " />

</form> // If my quick code example for this form is not correct dont worry its not the point im getting at :)

И они поместили «bowling» в top3_01, «running» в top3_02 и «diving» в top3_03, и мы поймали это на той же странице с небольшим количеством PHP вверху ->

if (isset($_POST)['update_button']) {
    $top3_01 = $_POST['top3_01']; // i.e, 'bowling' changing POST vars to local vars
    $top3_02 = $_POST['top3_02']; // i.e, 'running'
    $top3_03 = $_POST['top3_03']; // i.e, 'diving'
}

Со мной так далеко? Если бы у меня была таблица, в которой было 3 столбца (по 1 на каждый интерес), я мог бы поставить что-то вроде -

include('connect_msql.php');

mysql_query("Select * FROM users WHERE id='$id' AND blah blah blah");
mysql_query("UPDATE users SET top3_01='$top3_01', top3_02='$top3_02', top3_03='$top3_03' WHERE id='$id'");

И, надеюсь, если я правильно понял, он поместит их каждого в свою маленькую колонку. Достаточно просто, а? Но вот в чем дело, я хочу поместить все это в массив, который будет храниться в столбце 1 (скажем, с именем 'top3'), и, более того, они будут легко читаемыми в PHPmyadmin и доступны для редактирования оттуда, но при этом все еще можно будет вызывать обратно. отображается на странице по запросу.

Продолжая пример, предполагая, что я изменил таблицу для столбца 'top3' вместо отдельных столбцов, я мог бы поместить что-то вроде этого -

if (isset($_POST)['update_button']) {
    $top3_01 = $_POST['top3_01']; // i.e, 'bowling' changing POST vars to local vars
    $top3_02 = $_POST['top3_02']; // i.e, 'running'
    $top3_03 = $_POST['top3_03']; // i.e, 'diving'
    $top3_array = array($top3_01,$top3_02,$top3_03);
    include('connect_msql.php');

    mysql_query("UPDATE members SET top3='$top3_array' WHERE id='$id' AND blah blah blah");

Но в столбце он будет отображаться как «Массив», и при вызове с использованием запроса он будет отображать буквенную строку. вместо этого в каждом поле. Теперь я знаю, что вы можете использовать функции serialize() & unserialize(), но это делает запись в базе данных практически нечитаемой. Есть ли способ сделать его читаемым и редактируемым без создания системы управления контентом?

Если так, пожалуйста, дайте мне знать, и я буду вашим другом навсегда, лол, хорошо, возможно, нет, но я все равно буду очень признателен за помощь. Другое дело, если вы можете сделать это или что-то вроде этого, как мне добавить записи в этот массив, чтобы вернуться в базу данных?

Я надеюсь, что я достаточно объяснил здесь, но если не сказать так, и я пойду еще раз. Большое спасибо, новичок.

Ответы [ 4 ]

3 голосов
/ 27 ноября 2011

Вы делаете это неправильно!

Что произойдет, когда вы захотите увидеть всех пользователей, которые установили 'Музыка' как 1stприоритет в интересах?Или что, если вам нужно сообщить всем с интересом в «Филателия» , что это было объединено в категорию «Сбор вещей» ?И как бы вы осуществили такое слияние?

Первое: рекомендация книги: Антипаттерны SQL .Купи, укради .. мне все равно.Просто прочитайте это.

Хорошо.Вот как, ИМХО, это должно быть сделано.Давайте начнем:

Структура БД

Вы должны понимать, что у каждого пользователя есть несколько интересов, и каждый интерес будет (скорее всего) связан с более чем одним пользователем.Таким образом, вам необходимо создать БД, которая отражает отношение многие-ко-многим между сущностями:

  Users           UserInterests         Interests
 -------         ----------------      --------------
| user_id  PK   | user_id  FK         | interest_id  PK
| name          | interest_id  FK     | title
| email         | priority            | ...
| ...                                 | etc.
| etc.

Первичные ключи и внешние ключи помечены.Если вы не знаете, что они ... прочитайте.

Несколько запросов

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

  1. Получение списка интересов пользователя:

    SELECT 
       UsersInterests.priority AS priority,
       Interests.title as interest
    FROM Users
       LEFT JOIN UserInterests USING (user_id)  
       LEFT JOIN Interests USING (interest_id)
    WHERE
       Users.name = 'FooBar'
    
  2. Получение списка пользователей, которые имеют наминимум 2 из указанных интересов:

    SELECT 
        Users.user_id AS id,
        Users.name AS name,
        COUNT( UserInterests.interest_id ) AS similarities
    FROM Users
        LEFT JOIN UserInterests USING (user_id)
    WHERE UserInterests.interest_id IN ( 13, 42, 101)
    GROUP BY User.user_id
    HAVING similarities > 1
    
  3. Поиск пользователей, которые имеют определенный интерес

    SELECT
       Users.user_id AS id,
       Users.name AS name,
       UserInterests.priority AS priority
    FROM Users
       LEFT JOIN UserInterests USING (user_id)
       LEFT JOIN Interests USING (interest_id)
    WHERE Interests.title = 'Phishing'
    
  4. Все интересы, имеющие не менее 4время, помеченное как 1-е:

    SELECT 
        Interests.title AS interest,
        COUNT( UserInterests.user_id ) AS favorites
    FROM UserInterests
        LEFT JOIN Interests USING (interest_id)
    WHERE UserInterests.priority = 1
    GROUP BY UserInterests.interest_id
    HAVING favorites > 3
    

Если вы попытаетесь сохранить все основные интересы пользователя в одном поле, вы в конечном итоге будете делать операторы LIKE везде.Это плохо сказывается на производительности в краткосрочной перспективе и приводит к катастрофическим последствиям, если вам нужно обновлять результаты в больших количествах ... а что если вы решите сохранить первые 5 результатов через месяц?

0 голосов
/ 27 ноября 2011

Использование функции join().

mysql_query("UPDATE members SET top3='".join(',', $top3_array' )." ...";
0 голосов
/ 27 ноября 2011

Вы также можете использовать сериализацию строк. Смотрите пример ниже:

$Communication2 = $_POST['Communication'];
    $N = count($abc);
$Communication = NULL;
for($i=0; $i < $N; $i++)
{
    $Communication .= $Communication2[$i].",";
}
$Communication2 = serialize($_POST['Communication']);

Или читайте здесь:

Сериализация строк
Строка unserialize

Гудлак

0 голосов
/ 27 ноября 2011

Вам необходимо объединить элементы массива вместе с символом или символьной строкой, которая не встречается в самих элементах.

Вы можете объединить три элемента вместе с:

$top3_string=mysql_escape_string(implode('::',$top3_array));

, что даст вам строку:

bowling::running::diving

Это было бы легко редактировать в PHPMyAdmin и легко извлечь с помощью:

$top3_array=explode('::',$top3_string);

при условии, что при извлечении его в PHP вы вызываете переменную $ top3_string

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...