2016-03-07 4 views
1

Я ищу некоторую помощь по проблеме. Я пытаюсь вставить значения из массива в таблицу MySQL отдельно. Таким образом, не весь массив в одной строке, а в отдельных записях.Отдельные записи в массиве DB

форма что-то вроде этого:

<form <form class="reg" name="main_form" action="form.php" method="post">> 
<ul> 
    <li> 
    <label for="text1"> 
    <input type="checkbox" name="task[]" value="text1" />text1 
    </label> 
    </li> 
    <li> 
    <label for="text2"> 
    <input type="checkbox" name="task[]" value="text2" />text2 
    </label> 
    </li> 
    <li> 
    <label for="text3"> 
    <input type="checkbox" name="task[]" value="text3" />text3 
    </label> 
    </li> 
</ul> 
<input type="submit" value="submit" /> 
</form> 

В form.php у меня есть что-то вроде этого на данный момент whic работает, чтобы поместить все выбранные ящики в один ряд в таблице:

<?php 
require 'db/config.php'; 

$link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD); 

if (!$link){ 
    die('Could not connect due to: ' . mysql_error()); 
} 

$db_selected = mysql_select_db(DB_NAME, $link); 

if (!$db_selected){ 
    die('Can\'t use: ' . DB_NAME . ': ' . mysql_error()); 
} 

$task = implode (PHP_EOL, $_POST['task']); 

$sql = "INSERT INTO completed (task) VALUES ('$task')"; 

if (!mysql_query($sql)){ 
    die('Error: ' . mysql_error()); 
} 

mysql_close(); 
?> 

Если кто-то должен был пойти и установить флажок для всех трех (text1, 2 & 3), мне нужно, чтобы он был введен в БД в виде трех отдельных записей и не был сгруппирован вместе.

Я думаю, что мне нужно использовать что-то вроде explode(), прежде чем форма фактически загрузит их в БД, но я не уверен на 100%. Любая помощь будет оценена по достоинству.

+0

Просто хотел сказать, как примечание стороны, что, как говорит Kordi расширение MySQL является устаревшим, но не только, что он был удален из самой последней версии PHP, поэтому следует избегать его использования. – vove

+0

@vove для уведомления о том, что он полностью удален из последней версии php. Добавлено это на мой пост. – Kordi

ответ

1

Ваша версия фиксированной

Ваш фиксированной версии, но ваш апи является устаревшим и ваш метод не SQL Injection сохранить. Не используйте этот подход используйте лучший подход, о котором я упоминал позже в своем ответе.

Заменить этот

$task = implode (PHP_EOL, $_POST['task']); 
$sql = "INSERT INTO completed (task) VALUES ('$task')"; 

if (!mysql_query($sql)){ 
    die('Error: ' . mysql_error()); 
} 

с этим

<?php 
foreach ($_POST['task'] as $task) { 
    $sql = "INSERT INTO completed (task) VALUES ('$task')"; 
    if (!mysql_query($sql)){ 
     die('Error: ' . mysql_error()); 
    } 
} 

Лучше

Сохранить версии с новой Api причиной mysql_connect является устаревшим, и инъекции SQL сохранить. Поэтому используйте новый mysqli api. Чтобы предотвратить SQL Injection, вы должны действительно подготовить заявления, обновит мой ответ за это через минуту. Не используйте другой подход. Причина mysql_connect не только устарела, но и удалена в последней версии php из api. Спасибо @vove за ваше уведомление.

<?php 
require 'db/config.php'; 

$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); 

if ($mysqli->connect_error) { 
    die('Connect Error (' . $mysqli->connect_errno . ') ' 
      . $mysqli->connect_error); 
} 

$stmt = $mysqli->prepare("INSERT INTO completed (task) VALUES (?)"); 
if (!$stmt) { 
    echo $mysqli->error; 
    exit(); 
} 

foreach ($_POST['task'] as $task) { 
    $stmt->bind_param("s", $task); 
    $stmt->execute(); 
} 

$stmt->close(); 
$mysqli->close(); 

Выход обеих версий

бы текст1 и текст2 выбран.

mysql> select * from completed; 
+-------+ 
| task | 
+-------+ 
| text1 | 
| text2 | 
+-------+ 
+0

Спасибо за быстрый ответ. Да, я изменю api, но прежде, чем я начну слишком сильно меняться, я просто попытался заменить то, что вы дали мне изначально, и он только когда-либо вводит в SQL последний выбранный ящик. IE. Если я выберу флажок 1,2 и 4, в БД появится только 4. Не уверен, почему ... код выглядит хорошо из того, что я могу сказать: – Xyz

+0

@ Возможно, просто var_dump из sql, чтобы узнать, какие запросы sql вы отправили на сервер. Как выглядит структура вашего стола? – Kordi

Смежные вопросы