هدف از این مقاله یادگیری این نکته است که چگونه میتوانیم در یک پایگاه داده آرایه ای از مقادیر مختلف را درج نماییم. این آرایه میتواند مقادیر فیلدهای فرمی باشد که کاربر آن را تکمیل و ارسال نموده است.
در این مثال جدولی که قرار است داده هایمان را در آن درج کنیم جدولی است بسیار ساده که تنها از دو ستون تشکیل شده است و نام کاربری و شماره تلفن کاربران در آن درج میشود. برای ایجاد چنین جدولی متیوانیم از کوئری زیر استفاده نماییم:
CREATE TABLE `mytable` (
`username` TEXT,
`phonenum` INT
)
اکنون باید فرم وب مورد نظر را ایجاد نماییم. برای این کار فایلی به نام form.php ایجاد میکنیم. از آنجایی که میخواهیم اطلاعات چند کاربر را به یکباره درج کنیم، باید قابلیت ارسال یک آرایه را داشته باشیم. Php دارای یک متد اولیه برای جمع آوری یک آرایه از ورودی های کاربران است. برای آنکه بتوانیم از این متد استفاده کنیم میبایست به نام فیلد ورودی یک [] اضافه نماییم. در این حالت php هر فیلد با نام مشابه را بعنوان عضوی از آن آرایه در نظر خواهد گرفت.
به فرم ساده زیر دقت کنید:
<form method="POST" action="input.php">
<!-- Person #1 -->
<input type="text" name="username[]" />
<input type="text" name="phonenum[]" />
<!-- Person #2 -->
<input type="text" name="username[]" />
<input type="text" name="phonenum[]" />
<!-- Person #3 -->
<input type="text" name="username[]" />
<input type="text" name="phonenum[]" />
<input type="submit" />
</form>
در این فرم وب ما دو آرایه به نامهای username و phonenum داریم که مقادیر ورودی کاربر به ترتیب در این آرایه ها درج میشود. این ساده ترین راه جمع آوری ورودی های کاربران است.
Before we attempt to do anything with the database, you may want to check the output of the form. Create a file called input.php, which will parse the form data. To see the output of the form, we'll use the function print_r(). Place this line in the file:
. If you were to enter consecutive numbers in the fields (i.e. one through six), you will end up without output similar to this:
Array
(
[username] => Array
(
[0] => one
[1] => three
[2] => five
)
[phonenum] => Array
(
[0] => two
[1] => four
[2] => six
)
)
اکنون باید شروع به پردازش آرایه مورد نظر نماییم. برای این کار از حلقه foreach استفاده میکنیم. این حلقه به ما امکان میدهد تا یک آرایه را کامل پیمایش نماییم. در اینجا در حین پیمایش آرایه مقادیر آن را درون متغیرهایمان میریزیم.
foreach ($_POST['username'] as $row=>$name)
{
$username = $name;
$phonenum = $_POST['phonenum'][$row];
// codes to insert values to the database
}
$username و $phonenumمتغیرهایی هستند که نام کاربری و شماره تلفن در آنها ذخیره میشود. از آنجایی که متغیر $name توسط حلقه foreach مورد استفاده قرار میگیرد ، ما مجبوریم به صورت دستی مقدار شماره تلفن را بر اساس کلیدی تعیین کنیم که حلقه foreach انتساب داده است (@row)
اکنون که ما متغیرهایمان را توانسته ایم انتساب دهیم، کافی است آنها را در پایگاه داده ها درج کنیم. دقت کنید که در حالت ایده آل ما همیشه باید با استفاده از mysql_real_escape_string() مقدار شماره تلفن را بررسی کنیم. چرا که مقدار این فیلد متنی است و ممکن است حمله های امنیتی sql injection از طریق این فیلد صورت بگیرد. اما در اینجا برای سادگی مقاله از انجام چنین کاری چشم پوشی کرده ایم.
کوئری که با استفاده از آن مقدار را درون پایگاه داده ها درج میکنیم بسیار ساده است:
INSERT INTO `mytable` VALUES(“’ . $username . ‘”, ‘ . $phonenum . ‘)
در اینجا رشته ها را با استفاده از نقطه به هم چسبانده ایم. این کار هم خوانایی برنامه را افزایش میدهد و هم اینکه در بالا رفتن سرعت پردازش صفحه موثر است. پس در نهایت حلقه foreach ما به این شکل در می آید:
foreach ($_POST['username'] as $row=>$name)
{
$username = mysql_real_escape_string($name);
$phonenum = mysql_real_escape_string($_POST['phonenum'][$row]);
mysql_query('INSERT INTO `mytable` VALUES("' . $username . '", ' . $phonenum . ')') or die(mysql_error());
}
از آنجایی که ممکن است تعداد عناصر آرایه ها زیاد باشد، بهتر است از کد زیر استفاده نماییم تا سطرها را در مقاطع زمانی مشخصی درج نمایید:
$sql_start = 'INSERT INTO `mytable` VALUES '; // We'll use this at the beginning of each query
$sql_array = array(); // This is where we'll queue up the rows
$queue_num = 20; // How many rows should be queued at once?
foreach ($_POST['username'] as $row=>$name)
{
$username = $name;
$phonenum = $_POST['phonenum'][$row];
$sql_array[] = '(' . $username . ', ' . $phonenum . ')'; // Add a new entry to the queue
if (count($sql_array) >= $queue_num)
{ // We have reached the queue limit
mysql_query($sql_start . implode(', ', $sql_array)); // Insert those that are queued up
$sql_array = array(); // Erase the queue
}
}
if (count($sql_array) > 0) // There are rows left over
{
mysql_query($sql_start . implode(', ', $sql_array));
}