Как вставить Session Array в MySQL DB, используя PHP - PullRequest
0 голосов
/ 23 января 2011

У меня многостраничная форма, и я пытаюсь захватить массив как сеанс для вставки в MySQL. На второй странице формы находится раздел «Адрес». Здесь я прошу информацию об адресе. Пользователь может нажать кнопку «ввести другой адрес», которая открывает другое поле.

Пользователь нажимает «Далее», чтобы перейти на следующую страницу (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 не имеет ничего, кроме подключения к БД и вставке выше.

Ответы [ 3 ]

1 голос
/ 23 января 2011

Итак, просто пройдем и проведем некоторую очистку:

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

Нет необходимости вызывать 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 голосов
/ 23 января 2011

А также:

$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.

0 голосов
/ 23 января 2011

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

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