2010-05-12 7 views
1

Я изучаю PHP прямо сейчас, и я пытаюсь вставить данные в базу данных MySQL под названием «pumpl2». Таблица настроена следующим образом.Новичок PHP: я не могу вставить данные в базу MYSQL

create table product 
(productid int unsigned not null auto_increment primary key, 
    price int(9) not null, 
    value int(9) not null, 
    description text 
); 

У меня есть форму и вы хотите вставить поля из формы в базу данных. Вот как выглядит php-файл.

<?php 

// create short variable names 
$price = $_POST['price']; 
$value = $_POST['value']; 
$description = $_POST['description']; 

if (!$price || !$value || !$description) { 
echo "You have not entered all the required details.<br />" 
    ."Please go back and try again."; 
exit; 
} 

@ $db = new mysqli('localhost', 'pumpl', '********', 'pumpl2'); 

if (mysqli_connect_errno()) { 
echo "Error: Could not connect to database. Please try again later."; 
exit; 
} 

$query = "insert into pumpl2 values 
('".$price."', '".$value."', '".$description."')"; 
$result = $db->query($query); 

if ($result) { 
echo $db->affected_rows." product inserted into database."; 
} else { 
echo "An error has occurred. The item was not added."; 
} 

$db->close(); 

?> 

При отправке формы я получаю сообщение об ошибке «Произошла ошибка. Элемент не был добавлен».

Кто-нибудь знает, в чем проблема? Спасибо!

+2

Вы конкатенации сырые почтовые значения в операторе INSERT, который является очень плохой идеей. Вы должны изучить PDO и подготовленные заявления: http://www.php.net/manual/en/pdo.prepare.php –

+0

Я сейчас проверю. Благодаря! – Victor

+0

@Colonel фактически, PDO не имеют монополии на параметризованные запросы. mysqli имеет аналогичный механизм. –

ответ

3

Вы вставляете только три столбца, но у вас четыре, определенные в таблице. Таким образом, вы должны назвать столбцы в явном виде:

INSERT INTO tableName (ColumnA, ColumnB, ColumnC) VALUES ('A', 'B', 'C') 
4

Это должно дать вам больше информации:

echo "An error has occurred: " . $db->error(); 
+1

+1 за сообщение OP, как самому диагностировать проблему! – symcbean

+0

Спасибо. Я добавил это в скрипт. Я уверен, что это поможет в будущем. – Victor

+1

@ Victor, на самом деле, это неправильный подход. trigger_error() следует использовать вместо echo. и добавление самого запроса в сообщение об ошибке также будет хорошей идеей. –

3

Вы пытаетесь вставить в таблицу под названием pumpl2, но CREATE TABLE оператор создал таблицу с именем product ,

Кроме того, как ZeissS noted, вы должны учитывать следующее:

CREATE TABLE product ( 
    productid int unsigned not null auto_increment primary key, 
    price int(9) not null, 
    value int(9) not null, 
    description text 
); 
Query OK, 0 rows affected (0.09 sec) 

INSERT INTO product VALUES (1, 1, 'test'); 
ERROR 1136 (21S01): Column count doesn't match value count at row 1 

Чтобы решить эту ошибку, необходимо явно указать список столбцов:

INSERT INTO product (price, value, description) VALUES (1, 1, 'test'); 
Query OK, 1 row affected (0.03 sec) 
+0

Спасибо. Я считаю, что это правильно. Я объединил этот совет с советом выше, и это помогло мне решить проблему. – Victor

+0

Нет, вы не должны вставлять здесь NULL, так как столбец определяется как «не null» и «auto_increment». Я бы сказал, что работа с NULL здесь слишком сильно зависит от базовой базы данных. Проясните (другие люди не путаются пустым значением) и просты: не вставляйте этот столбец. – ZeissS

+0

@ZeissS: Хорошая точка. Исправлена. (Фактически, он не работал бы в строгом режиме.) –

0

Это может быть некоторые причины.

Попробуйте

echo "Errormessage: ".$db->error; 

, чтобы получить более подробную информацию, почему Insert не работает.

1

Ваш запрос неверен, у вас не было указанных столбцов. Попробуйте с:

"INSERT INTO pumpl2 (price, value, description) VALUES ('".$price."', '".$value."', '".$description."')" 

Помимо этого, не используйте _POST значения $ вводить их непосредственно в базу данных. Найдите SQL Injection на этом. Сначала используйте mysql_real_escape_string для данных $ _POST или даже лучше используйте подготовленные операторы.

+0

Указание значений не требуется, если вы вставляете значение для каждого столбца и в правильном порядке. Однако, это * хорошая практика, чтобы указать их. EDIT: ah right, OP не вставлял во все столбцы. – DisgruntledGoat

0

Ваш стол называется products не pumpl2. Кроме того, вы должны сделать:

insert into product (price, value, description) values (... 
2
$query = "insert into pumpl2.product (price, value, description) values('" . 
     $db->read_escape_string($price) . "', '". 
     $db->read_escape_string($value) . "', '" . 
     $db->read_escape_string($description) . "')"; 
$result = $db->query($query); 

И обязательный XKCD мульт:

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