2011-01-23 5 views
0

У меня есть многостраничная форма и я пытаюсь захватить массив в качестве сеанса для вставки в mysql. Вторая страница формы - это раздел «Адрес». Здесь я прошу адресную информацию. Пользователь может нажать кнопку «ввести другой адрес», которая расширит еще одну ячейку.Как вставить массив сеансов в MySQL DB с помощью PHP

Пользователь нажимает рядом со следующей страницей (phone.php), где я запрашиваю информацию о телефоне. На этой странице я думаю, что я правильно регистрировать данные сессии следующим образом:

if(!isset($_SESSION)) 
{ 
@session_start(); 
} 
header("Cache-control: private"); 
ob_start(); 

include('header.php'); 

//now, let's register our session variables from address.php 
session_register('addressLineOne'); 
session_register('addressLineTwo'); 

//finally, let's store our posted values in the session variables 
$_SESSION['addressLineOne'] = $_POST['addressLineOne']; 
$_SESSION['addressLineTwo'] = $_POST['addressLineTwo']; 

В конце концов мы попали в submit.php. Если я отключу код для добавления дополнительного адреса, это вставка, которую я использую, которая работает нормально.

$insertAddress="INSERT INTO address (idperson, addressLineOne, addressLineTwo) 
VALUES ('$id','$_SESSION[addressLineOne]','$_SESSION[addressLineTwo]')"; 
if (!mysql_query($insertAddress,$con)) 
    {die('Error: ' . mysql_error());} 
echo ""; 

Когда я включаю «добавить дополнительный адрес» код, вставка выше будет вставлять «ARRAY» в каждой области БД. Я пытался из следующих действий:

foreach($_SESSION['idperson'] as $row=>$id) 
{ 
    $idperson=$id; 
    $addressLineOne=$_SESSION['addressLineOne'][$row]; 
    $addressLineTwo=$_SESSION['addressLineTwo'][$row]; 
} 
//enter rows into database 
foreach($_SESSION['idperson'] as $row=>$id) 
{ 
    $idperson=mysql_real_escape_string($id); 
    $addressLineOne=mysql_real_escape_string($_SESSION['addressLineOne'][$row]); 
    $addressLineTwo=mysql_real_escape_string($_SESSION['addressLineTwo'][$row]); 
} 

$insertAddress="INSERT INTO address (idperson, addressLineOne, addressLineTwo) 
VALUES ('.$id.','.$addressLineOne.','.$addressLineTwo.')"; 

if (!mysql_query($insertAddress,$con)) 
{ 
die('Error: ' . mysql_error()); 
} 
echo "$row record added"; 

Вместо того чтобы работать, однако, выше просто вставляет пару точек, как «...» в базу данных. Я не знаю, что еще делать. Неужели я не правильно собираю данные сеанса? Мой код foreach выключен? Спасибо за любую помощь.

Вот код, я использую, чтобы добавить еще одну таблицу на address.php:

<?php for($i=1; $i<6; $i++):?> 
<div id='hidden<?php echo $i; ?>' style='display: none'> 
<tr class="odd"> 
    <td width="33%">Street/Number</td> 
    <td><input type="text" name="addressLineOne[]" id="addressLineOne<?php echo $i; ?>"/></td> 
</tr> 
<tr> 
    <td>Address 2</td> 
    <td><input type="text" name="addressLineTwo[]" id="addressLineTwo<?php echo $i; ?>"/></td> 
</tr> 
<?php endfor; ?> 

Submit.php не имеет ничего, кроме подключения к БД и выше вставки.

+2

Итак, просто на первом проходе: знаете ли вы, что 'session_register' устарел? и что его использование с '$ _SESSION' приведет к сумасшедшим, диким и непредсказуемым результатам (согласно руководству)? –

+0

Я этого не знал. Я не программист php, просто понимаю, как это происходит. я, должно быть, получил это из старого учебника. Могу ли я просто полностью удалить session_register? – dfour

+0

На втором проходе: нам нужно увидеть больше от 'submit.php' или этой вещи" inserting array ", которую вы делаете. –

ответ

0

Не зная, что ваш «добавить дополнительный адресный код», кажется, что переменные выходят как массивы. Чтобы точно проверить, что вы храните, вы можете использовать функцию PHP var_dump. Я предлагаю добавить var_dump($_SESSION); где-нибудь в вашем коде, чтобы точно увидеть, что хранится в сеансе, чтобы вы могли убедиться, что это то, что вы думаете.

+0

Я должен был упомянуть, что этот раздел выглядит следующим образом. dfour

+0

Я предлагаю вам обновить свой вопрос и добавить этот код. Что вам нужно сделать при выполнении «var_dump ($ _ SESSION)»? В любом случае кажется, что вы хотите присоединиться к массиву перед вставкой в ​​базу данных. не может просто выгрузить массив PHP в вашу базу данных и заставить его работать. Попробуйте заменить '$ addressLineOne'' implode ("\ n", $ addressLineOne) 'при построении SQL-запроса (и аналогичным образом для' $ addressLineTwo') –

+0

Извините, я вонял при форматировании этих комментариев. Это результат, который я получаю с дампом. И я обновил свой оригинальный пост еще с помощью кода ....... ["addressLineOne"] => array (6) {[0] => string (12) "streetnumber" [1] => string (13) "streetnumber2" [2] => string (0) "" [3] => string (0) "" [4] => string (0) "" [5] => string (0) ""} ["addressLineTwo"] => array (6) {[0] => string (4) "apt1" [1] => string (4) "apt2" [2] => string (0) "" [3] => string (0) "" [4] => string (0) "" [5 ] => string (0) – dfour

1

Так просто переживает и делает некоторые очистки:

Ваш первый блок:

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

session_start(); 
header("Cache-control: private"); 
ob_start(); 
include('header.php'); 

Нет необходимости регистрировать переменные сессии с session_register, это осуждается сейчас и руководство говорит, не использовать его - особенно не использовать его смешивание с использованием $_SESSION множеств.

$_SESSION['addressLineOne'] = $_POST['addressLineOne']; 
$_SESSION['addressLineTwo'] = $_POST['addressLineTwo']; 

Так $_SESSION теперь содержит по меньшей мере две клавиши, соответствующие тому, что только что было установлено.

Остальная часть вашей проблемы проистекает из вероятного итерации через структуру массива неправильно (покажите нам еще немного вашего кода).

Некоторых очистки на второй блоке:

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

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

// enter rows into database 
foreach($_SESSION['addressLineOne'] as $row => $id){ 
    $idperson = mysql_real_escape_string($_SESSION['idperson']); 
    $addressLineOne = mysql_real_escape_string($_SESSION['addressLineOne'][$row]); 
    $addressLineTwo = mysql_real_escape_string($_SESSION['addressLineTwo'][$row]); 
    $insertAddress="INSERT INTO address (idperson, addressLineOne, addressLineTwo) 
        VALUES ('.$id.','.$addressLineOne.','.$addressLineTwo.')"; 
    if(!mysql_query($insertAddress,$con)){ 
     // maybe not the best use of `die` here? 
     die('Error: ' . mysql_error()); 
    } 
    echo "$row record added"; 
} 
+0

Благодарим вас за предложения по очистке. Я их реализовал. К сожалению, код, указанный выше для входа в базу данных, не попадает в адресную таблицу. – dfour

+0

@dfour: Я сделал небольшое изменение, так что 'foreach' находится на' addressLineOne' вместо 'idperson', я подозреваю, что это исправит вашу проблему. –

0

Как:

$insertAddress="INSERT INTO address (idperson, addressLineOne, addressLineTwo) VALUES ('.$id.','.$addressLineOne.','.$addressLineTwo.')"; 

Вы используете строк в двойных кавычках, так ' одиночные кавычки в запросе не будет «выйти» из режима строки, так что если $id, $ addressLineOne and $ addressLineTwo` пустые по какой-либо причине, ваш запрос заканчивает тем, как:

INSERT INTO ... VALUES ('..', '..', '..') 

, который объясняет, почему вы получаете точки в йо ур.

либо переписать запрос, чтобы быть

$insertAddress = "INSERT .... VALUES ('$id', '$addressLineOne', '$addressLineTwo') 

или

$insertAddress = 'INSERT ... VALUES (\'' . $id . '\', \'' ....) 

Лично непосредственно писать переменные в двойных кавычках приводит к гораздо более читаемый код, особенно в подсветку синтаксиса редактор, который PHP-осознанный.