Не могу записать данные из массива в базу

В чем причина ошибки?


  • Всего проголосовало
    8

zlatkovic

Новичок
Ребят, я уже весь гугл перелопатил, все форумы просмотрел, все попробовал, но ничего не получается.
Привожу код:

Форма:
PHP:
<?php
echo <<<_END
	<!DOCTYPE html>
	<html>
	<head>
	<meta charset="utf-8">
	<title>Добавить продукт</title>
	<link rel='stylesheet' href='layouts/css/reset.css'>
	<link rel='stylesheet' href='layouts/css/admin-style.css'>
	</head>
	<body>
		<div class='admin-center'>
		<form action='addproduct.php' method='POST' enctype='multipart/form-data'>
		Категория:&nbsp;<input type='text' name='category' size='30' class='addproduct'><br>
		Название:&nbsp;<input type='text' name='title' size='30' class='addproduct'><br>
		Описание:&nbsp;<textarea name='descr' class='addproduct' rows=5></textarea><br>
		Дата:&nbsp;<input type='text' name='date' size='30' class='addproduct'><br>
		Скрин:&nbsp;<input type='file' name='screen[]' class='addproduct'><br>
		Скрин:&nbsp;<input type='file' name='screen[]' class='addproduct'><br>
		Скрин:&nbsp;<input type='file' name='screen[]' class='addproduct'><br>
		Скрин:&nbsp;<input type='file' name='screen[]' class='addproduct'><br>
		<input type='submit' name='doUpload' value='Отправить' class='addproduct-btn'>
		</form>
		</div>
	</body>
	</html>
_END;
?>
Обработчик:
PHP:
<?php
require_once 'login.php';
if (isset($_POST['category']) &&
    isset($_POST['title']) &&
    isset($_POST['descr']) &&
	isset($_POST['date']))
{
   $category = $_POST['category'];
   $title = $_POST['title'];
   $descr = $_POST['descr'];
   $date = $_POST['date'];
}
if ((empty($category)) ||
	(empty($title)) ||
	(empty($descr)) ||
	(empty($date)))
{
echo "<script language=javascript>alert('Заполните все поля');</script>";
echo "<script>history.go(-1)</script>";
exit;
}
$imgDir = "../portfolio/img";
@mkdir($imgDir, 0777);
if (isset($_FILES))
{
	$screen = $_FILES['screen'];
	foreach($screen['name'] as $i => $file)
	{
		switch($screen['type'][$i])
		{
			case 'image/pjpeg':
			case 'image/jpeg': $type = 'jpg'; break;
			case 'image/png':  $type = 'png'; break;
			case 'image/gif':  $type = 'gif'; break;
			case 'image/tiff': $type = 'tif'; break;
			default:           $type = '';    break;
		}
		$tmpname = $screen['tmp_name'][$i];
		$path = "$imgDir/".time()."-[$i].".$type;
		move_uploaded_file($tmpname, $path);
		$array = array($path);
		$serialize = serialize($array);
	}
}
$connect = mysql_connect($db_hostname, $db_username, $db_password) or die("Ошибка соединения с сервером");
mysql_select_db($db_database, $connect) or die ("База данных не выбрана");
mysql_query ("CREATE DATABASE IF NOT EXISTS $db_database") or die ("Ошибка соединения с БД");
mysql_query ("CREATE TABLE IF NOT EXISTS portfolio (
	id INT NOT NULL AUTO_INCREMENT,
	category VARCHAR(160),
	title VARCHAR(160),
	descr TEXT,
	date VARCHAR(160),
	screens TEXT,
	PRIMARY KEY (id)
)") or die (mysql_error());
mysql_query ("INSERT INTO portfolio (category, title, descr, date, screens) 
VALUES ($category, $title, $descr, $date, $serialize)") or die (mysql_error());
mysql_close ($connect);
exit;
?>
Писал с подсказками (т.к. код не давали), некоторое с помощью книги.
Суть в том, что в ячейку screens записывается последний элемент массива вида:

PHP:
a:1:{i:0;s:32:"../portfolio/img/1359715142-[3].";}
Плюс ко всему выдает ошибку:
PHP:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':1:{i:0;s:35:"../portfolio/img/1359757478-[3].jpg";})' at line 2
Но если:
PHP:
echo $serialize;
То выводится строка вида:
PHP:
a:1:{i:0;s:35:"../portfolio/img/1359703327-[0].jpg";}
a:1:{i:0;s:35:"../portfolio/img/1359703327-[1].png";}
a:1:{i:0;s:35:"../portfolio/img/1359703327-[2].jpg";}
a:1:{i:0;s:35:"../portfolio/img/1359703327-[3].jpg";}
И ошибка:
PHP:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':1:{i:0;s:35:"../portfolio/img/1359757478-[3].jpg";})' at line 2
Либо добавляет последнее значение, либо не добавляет ничего. Я уже не помню что и при каких условиях происходило.
 

С.

Продвинутый новичок
Ошибка не в $serialize, а в SQL коде. Поэтому и выводить для просмотра надо не $serialize, а SQL. Ну и пялиться на него (при условии, что ты имеешь представление о синтаксисе SQL).
 

zlatkovic

Новичок
Ошибка не в $serialize, а в SQL коде. Поэтому и выводить для просмотра надо не $serialize, а SQL. Ну и пялиться на него (при условии, что ты имеешь представление о синтаксисе SQL).
Вы не подскажете, как это сделать?
У тебя переменные строковые, а в кавычки ты их не берешь.
Исправил
 

zlatkovic

Новичок
Попробовал вывести данные, но, видимо, опять что-то упустил:
PHP:
$connect = mysql_connect($db_hostname, $db_username, $db_password) or die("Ошибка соединения с сервером");
mysql_select_db($db_database, $connect) or die ("База данных не выбрана");
mysql_query ("CREATE DATABASE IF NOT EXISTS $db_database") or die ("Ошибка соединения с БД");
mysql_query ("CREATE TABLE IF NOT EXISTS portfolio (
	id INT NOT NULL AUTO_INCREMENT,
	category VARCHAR(160),
	title VARCHAR(160),
	descr TEXT,
	date VARCHAR(160),
	screens TEXT,
	PRIMARY KEY (id)
)") or die (mysql_error());
mysql_query ("INSERT INTO portfolio (category, title, descr, date, screens) 
VALUES ('$category', '$title', '$descr', '$date', '$serialize')") or die (mysql_error());
$sql = mysql_query ("SELECT * FROM portfolio ORDER BY 'id' DESC");
while ($sql_data = mysql_fetch_array($sql))
{
$category = $sql_data['category'];
$title = $sql_data['title'];
$descr = $sql_data['descr'];
$date = $sql_data['date'];
$serialize = $sql_data['serialize'];
}
mysql_close ($connect);
$unserialize = unserialize($serialize);
foreach($unserialize as $i => $echo);
echo "$category<br>$title<br>$descr<br>$date<br>$serialize";
?>
Ну никак не получается понять работу с массивами. До этого мной был написан код, но он был огромный, и в базе для каждого скрина создавались отдельные столбцы. Решил минимизировать, и уже третий день не получается
 

Фанат

oncle terrible
Команда форума
лучше бы вернуться к старой системе, со столбцами.
количество кода помогу уменьшить
 

zlatkovic

Новичок
PHP:
<?php
require_once 'login.php';
if (isset($_POST['category']) &&
    isset($_POST['title']) &&
    isset($_POST['descr']) &&
	isset($_POST['date']))
{
   $category = $_POST['category'];
   $title = $_POST['title'];
   $descr = $_POST['descr'];
   $date = $_POST['date'];
}
if ((empty($category)) ||
	(empty($title)) ||
	(empty($descr)) ||
	(empty($date)))
{
echo "<script language=javascript>alert('Заполните все поля');</script>";
echo "<script>history.go(-1)</script>";
exit;
}
$imgDir = "../portfolio/img";
@mkdir($imgDir, 0777);
if ($_FILES)
{
	$_FILES['preview']['tmp_name'];
	$_FILES['screen1']['tmp_name'];
	$_FILES['screen2']['tmp_name'];
	$_FILES['screen3']['tmp_name'];
	$_FILES['screen4']['tmp_name'];
	$_FILES['screen5']['tmp_name'];
	switch($_FILES['preview']['type'])
	{
		case 'image/pjpeg':
		case 'image/jpeg': $type0 = 'jpg'; break;
		case 'image/png':  $type0 = 'png'; break;
		case 'image/gif':  $type0 = 'gif'; break;
		case 'image/tiff': $type0 = 'tif'; break;
		default:           $type0 = '';    break;
	}
	switch($_FILES['screen1']['type'])
	{
		case 'image/pjpeg':
		case 'image/jpeg': $type1 = 'jpg'; break;
		case 'image/png':  $type1 = 'png'; break;
		case 'image/gif':  $type1 = 'gif'; break;
		case 'image/tiff': $type1 = 'tif'; break;
		default:           $type1 = '';    break;
	}
	switch($_FILES['screen2']['type'])
	{
		case 'image/pjpeg':
		case 'image/jpeg': $type2 = 'jpg'; break;
		case 'image/png':  $type2 = 'png'; break;
		case 'image/gif':  $type2 = 'gif'; break;
		case 'image/tiff': $type2 = 'tif'; break;
		default:           $type2 = '';    break;
	}
	switch($_FILES['screen3']['type'])
	{
		case 'image/pjpeg':
		case 'image/jpeg': $type3 = 'jpg'; break;
		case 'image/png':  $type3 = 'png'; break;
		case 'image/gif':  $type3 = 'gif'; break;
		case 'image/tiff': $type3 = 'tif'; break;
		default:           $type3 = '';    break;
	}
	switch($_FILES['screen4']['type'])
	{
		case 'image/pjpeg':
		case 'image/jpeg': $type4 = 'jpg'; break;
		case 'image/png':  $type4 = 'png'; break;
		case 'image/gif':  $type4 = 'gif'; break;
		case 'image/tiff': $type4 = 'tif'; break;
		default:           $type4 = '';    break;
	}
	switch($_FILES['screen5']['type'])
	{
		case 'image/pjpeg':
		case 'image/jpeg': $type5 = 'jpg'; break;
		case 'image/png':  $type5 = 'png'; break;
		case 'image/gif':  $type5 = 'gif'; break;
		case 'image/tiff': $type5 = 'tif'; break;
		default:           $type5 = '';    break;
	}
	if ($type0)
	{
		$preview = "$imgDir/".time()."-0.".$type0;
		move_uploaded_file($_FILES['preview']['tmp_name'], $preview);
	}
	else echo "Нет превью<br>";
	if ($type1)
	{
		$screen1 = "$imgDir/".time()."-1.".$type1;
		move_uploaded_file($_FILES['screen1']['tmp_name'], $screen1);
	}
	else echo "Нет скрина1<br>";
	if ($type2)
	{
		$screen2 = "$imgDir/".time()."-2.".$type2;
		move_uploaded_file($_FILES['screen2']['tmp_name'], $screen2);
	}
	else echo "Нет скрина2<br>";
	if ($type3)
	{
		$screen3 = "$imgDir/".time()."-3.".$type3;
		move_uploaded_file($_FILES['screen3']['tmp_name'], $screen3);
	}
	else echo "Нет скрина3<br>";
	if ($type4)
	{
		$screen4 = "$imgDir/".time()."-4.".$type4;
		move_uploaded_file($_FILES['screen4']['tmp_name'], $screen4);
	}
	else echo "Нет скрина4<br>";
	if ($type5)
	{
		$screen5 = "$imgDir/".time()."-5.".$type5;
		move_uploaded_file($_FILES['screen5']['tmp_name'], $screen5);
	}
	else echo "Нет скрина5<br>";
}
$connect = mysql_connect($db_hostname, $db_username, $db_password) or die("Ошибка соединения с сервером");
	$result = mysql_query ("CREATE DATABASE IF NOT EXISTS $db_database") or die ("Ошибка соединения с БД");
	$db = mysql_select_db($db_database, $connect) or die ("База данных не выбрана");
	$result;
	mysql_query ("CREATE TABLE IF NOT EXISTS portfolio (
	  id INT NOT NULL AUTO_INCREMENT,
	  category VARCHAR(160),
	  title VARCHAR(160),
	  descr VARCHAR(300),
	  preview TEXT,
	  screen1 TEXT,
	  screen2 TEXT,
	  screen3 TEXT,
	  screen4 TEXT,
	  screen5 TEXT,
	  date VARCHAR(160),
	  PRIMARY KEY (id)
	)") or die (mysql_error());
	mysql_query ("INSERT INTO portfolio (category, title, descr, preview, screen1, screen2, screen3, screen4, screen5, date) VALUES ('$category', '$title', '$descr', '$preview', '$screen1', '$screen2', '$screen3', '$screen4', '$screen5', '$date')") or die (mysql_error());
	mysql_close ($connect);
exit;
?>
Система, в целом, неплохая, только человек не может заранее знать, сколько изображений будет добавлять, поэтому было решено сделать через массивы
Очень надеюсь на вашу помощь
 
Сверху