Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Занесение данных из формы в MySQL


Автор: QaaZ 15.10.2008, 19:14
Привет, проблема такая, в бд не записываются данные...Вроде всё верно, а всё равно в базу не записывается...(

Вот код:
Подключени и выбор БД:
Код

// Подключаемся к БД
@$dbconnect = new mysqli(
                        "$dbhost",
                        "$dbuser",
                        "$dbpass",
                        "$dbname");


    if (!$dbconnect) {
                         echo "<br>Неудалось подключиться к базе данных.";
                     }
//Выбираем БД
    mysqli_select_db($dbconnect,$dbname);
        if (!@mysqli_select_db($dbconnect,$dbname)) 
                    {
                        echo( "<P> В настоящий момент база данных не доступна.</P>" );
 
                   }


Добавлении записи:
Код

$sql = "INSERT INTO `$dbname`.`login` (`Username`, `Password`, `Gender`,`IsActivated`, `DateOfBirth`, `DateOfRegistration`) VALUES (\'$login\', \'$passwd\', \'$sex\', \'1\',\'$date\', \'$reg_date\')";
$res = mysqli_query($dbconnect,$sql);

Автор: HackMan 15.10.2008, 19:24
Может где ошибся в названии полей?
зы. зачем БД выбирается 2 раза?

Автор: QaaZ 15.10.2008, 19:27
Нет, там всё ок. :( 


Цитата

зы. А зачем БД выбирается 2 раза?


Это я уже увлёкся когда искал ошибку... :(

Автор: HackMan 15.10.2008, 19:30
А зачем слэши перед кавычками?

Автор: unicross 15.10.2008, 19:30
Цитата(QaaZ @ 15.10.2008,  19:14)


$sql = "INSERT INTO `$dbname`.`login` (`Username`, `Password`, `Gender`,`IsActivated`, `DateOfBirth`, `DateOfRegistration`) VALUES (\'$login\', \'$passwd\', \'$sex\', \'1\',\'$date\', \'$reg_date\')";
$res = mysqli_query($dbconnect,$sql);
[/code]


Зачем экранируете апострофы? Это ошибка!

Код

VALUES ('$login', '$passwd', '$sex', '1', '$date', '$reg_date')


Цитата

`$dbname`.`login`


Это что такое??? Слияние двух строк? Или что?
Нужно чтобы было примерно так:

Код

INSERT INTO `City` (`id_City`, `City`) VALUES (1, 'Санкт-Петербург')


Автор: Валерия 15.10.2008, 19:30
Цитата(QaaZ @  15.10.2008,  19:14 Найти цитируемый пост)
$res = mysqli_query($dbconnect,$sql);

Ты местами перепутал аргументы smile
(обновленонет, в самом деле не перепутал)
И 
Код

 mysqli_select_db($dbconnect,$dbname);

можешь не делать, как выше подсказывают. Достаточно того что в if

Автор: HackMan 15.10.2008, 19:31
Цитата(Валерия @  15.10.2008,  19:30 Найти цитируемый пост)
Ты местами перепутал аргументы smile

не-не-не, там всё правильно

Цитата(unicross @  15.10.2008,  19:30 Найти цитируемый пост)
Это что такое??? Слияние двух строк? Или что?

это не слияние двух строк, а бессмысленное указание, из какой БД таблица

Автор: QaaZ 15.10.2008, 19:36
Код

`$dbname`.`login`



У меня база имеет вид:
[*]baza
------[*]_login
------[*]_world

Автор: unicross 15.10.2008, 19:39
База данных у вас уже выбрана ранее. Можно просто 

Код

`login`


Так пробывали

Код

$sql = "INSERT INTO `login` (`Username`, `Password`, `Gender`,`IsActivated`, `DateOfBirth`, `DateOfRegistration`) VALUES ('$login', '$passwd', '$sex', '1', '$date', '$reg_date')";


или так (если поля идут по порядку конечно)

Код

$sql = "INSERT INTO `login` VALUES ('$login', '$passwd', '$sex', '1', '$date', '$reg_date')";

Автор: QaaZ 15.10.2008, 19:53
Цитата

База данных у вас уже выбрана ранее. Можно просто `login`


Цитата

это не слияние двух строк, а бессмысленное указание, из какой БД таблица



Это я уже увлёкся когда искал ошибку... :(


Цитата

INSERT INTO `City` (`id_City`, `City`) VALUES (1, 'Санкт-Петербург')


Всё равно не записывает...

Автор: unicross 15.10.2008, 19:56
Зачем вы вначане пользуетесь объектным стилем, а затем процедурным???
Надо примерно так:

Код

@$dbconnect = new mysqli(
                        "$dbhost",
                        "$dbuser",
                        "$dbpass",
                        "$dbname");


if (!$dbconnect) {
                         echo "<br>Неудалось подключиться к базе данных."; exit();
                     }
//Выбираем БД
        if (!@$dbconnect->mysqli_select_db($dbname)) 
                    {
                        echo "<P> В настоящий момент база данных не доступна.</P>" ); exit();
 
                   }

$sql = "INSERT INTO `login` (`Username`, `Password`, `Gender`,`IsActivated`, `DateOfBirth`, `DateOfRegistration`) VALUES ('$login', '$passwd', '$sex', '1', '$date', '$reg_date')";
$res = $dbconnect->mysqli_query($sql);


Автор: QaaZ 15.10.2008, 19:58
А так выдаёт ошибку :

Код

Fatal error: Call to undefined method mysqli::mysqli_query() in D:\www\register\registration.php on line 90

Автор: HackMan 15.10.2008, 19:59
id_City у тебя автоинкремент? Если да, то опусти его

Код
INSERT `City` SET `City`='Санкт-Петербург'

Автор: unicross 15.10.2008, 20:02
Замени 

Код

$res = $dbconnect->mysqli_query($sql);


на

Код

$res = $dbconnect->query($sql);


Я просто забыл убрать лишнее.

Автор: QaaZ 15.10.2008, 20:04
Заменил, всё равно не помогает.. х_х 

Автор: unicross 15.10.2008, 20:06
Кстати, уберите и эти строки

 
Код

       if (!@$dbconnect->mysqli_select_db($dbname)) 
                    {
                        echo "<P> В настоящий момент база данных не доступна.</P>" ); exit();
 
                   }


Они лишние, т.к. вы выбрали базу в конструкторе объекта

Автор: QaaZ 15.10.2008, 20:08
Вот кстате весь отрывок кода  для реги, может где-то в другом месте ошибка?

Код

// Подключаемся к БД
@$dbconnect = new mysqli(
                        "$dbhost",
                        "$dbuser",
                        "$dbpass",
                        "$dbname");


    if (!$dbconnect) {
                         echo "<br>Неудалось подключиться к базе данных.";
                     }
                    
                    
@$login = mysqli_real_escape_string($dbconnect,$_POST['login']);
@$pass1 = mysqli_real_escape_string($dbconnect,$_POST['pass1']);
@$pass2 = mysqli_real_escape_string($dbconnect,$_POST['pass2']);
@$sex   = mysqli_real_escape_string($dbconnect,$_POST['sex']);
$date = date('D-M-Y');
$reg_date = date('D-M-Y');
$passwd = md5($pass1);


$sql = "INSERT INTO `login` (`Username`, `Password`, `Gender`,`IsActivated`, `DateOfBirth`, `DateOfRegistration`) VALUES ('$login', '$passwd', '$sex', '1', '$date', '$reg_date')";
$res = $dbconnect->query($sql);

Автор: unicross 15.10.2008, 20:21
Подобный код у меня прошел на ура:

Код

$mysqli = new mysqli("localhost", "root", "", "tests");
if (mysqli_connect_errno()) {
    echo "Ошибка"; exit();
}
$sql = "INSERT INTO `City` (`id_City`, `City`) VALUES (1, 'Санкт-Петербург')";
if ($mysqli->query($sql)) {
   echo "Все ОК";
}
$mysqli->close();


При наличии БД tests и такой таблицы

Код

CREATE TABLE City (
   id_City int NOT NULL auto_increment,
   City char(50) NOT NULL,
   PRIMARY KEY  (id_City)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251;


Покажите SQL запрос для создания вашей БД

Цитата(QaaZ @  15.10.2008,  20:08 Найти цитируемый пост)
@$login = mysqli_real_escape_string($dbconnect,$_POST['login']);


надо заменить на 

Код

$login = $dbconnect->real_escape_string($_POST['login']);



Автор: QaaZ 15.10.2008, 20:33
Вот код создания бд. (не полный, только saga_login)

Код

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `saga_login` ;
USE `saga_login`;

-- -----------------------------------------------------
-- Table `saga_login`.`list_worlds`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `saga_login`.`list_worlds` ;

CREATE  TABLE IF NOT EXISTS `saga_login`.`list_worlds` (
  `Id` TINYINT(1) UNSIGNED NOT NULL AUTO_INCREMENT ,
  `Name` VARCHAR(128) NOT NULL ,
  `Proof` VARCHAR(128) NOT NULL ,
  PRIMARY KEY (`Id`) );


-- -----------------------------------------------------
-- Table `saga_login`.`list_worldcharacters`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `saga_login`.`list_worldcharacters` ;

CREATE  TABLE IF NOT EXISTS `saga_login`.`list_worldcharacters` (
  `UserId` TINYINT(3) UNSIGNED NOT NULL ,
  `WorldId` TINYINT(3) UNSIGNED NOT NULL ,
  `CharacterCount` TINYINT(3) UNSIGNED NOT NULL ,
  INDEX Index_1 (`UserId` ASC) );


-- -----------------------------------------------------
-- Table `saga_login`.`login`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `saga_login`.`login` ;

CREATE  TABLE IF NOT EXISTS `saga_login`.`login` (
  `UserId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
  `Username` VARCHAR(32) NOT NULL ,
  `Password` VARCHAR(32) NOT NULL ,
  `Gender` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' ,
  `LastUserIP` BIGINT(20) UNSIGNED NOT NULL DEFAULT '0' ,
  `LastSession` INT(10) UNSIGNED NOT NULL DEFAULT '0' ,
  `ActiveSession` INT(10) UNSIGNED NOT NULL DEFAULT '0' ,
  `LastLoginDate` DATETIME NULL DEFAULT NULL ,
  `IsActivated` TINYINT(1) NOT NULL DEFAULT '0' ,
  `IsBanned` TINYINT(1) NOT NULL DEFAULT '0' ,
  `HasAgreed` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' ,
  `DateOfBirth` DATE NOT NULL ,
  `DateOfRegistration` DATE NOT NULL ,
  `IsTestAccount` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' ,
  `LastPlayedWorld` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' ,
  `GmLevel` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' ,
  `GameTime` BIGINT(20) UNSIGNED NOT NULL DEFAULT '0' ,
  PRIMARY KEY (`UserId`, `Username`) ,
  UNIQUE INDEX Username (`Username` ASC) );




P.S. На C# вот так код проходит на ура :

Код

public void CreateAcc(string name, string pass, int gender)
        {
            MySqlCommand command = 
                new MySqlCommand("INSERT INTO login (`Username`,`Password`,`Gender`, `IsActivated`, `DateOfBirth`, `DateOfRegistration`) VALUES (?AccName,?AccPass,?AccGender, 1, ?Date, ?RegDate);", conn);
            command.Parameters.AddWithValue("AccName", name);
            command.Parameters.AddWithValue("AccPass", CreateHash(pass));
            command.Parameters.AddWithValue("AccGender", gender);
            command.Parameters.AddWithValue("Date", "2000-01-01");
            command.Parameters.AddWithValue("RegDate", DateTime.Today);
            command.ExecuteNonQuery();
        }


Добавлено @ 20:36
Цитата

@$login = mysqli_real_escape_string($dbconnect,$_POST['login']);

надо заменить на 

$login = $dbconnect->real_escape_string($_POST['login']);


Поменял, спасибо. smile

Автор: skyboy 15.10.2008, 20:53
не понимаю, почему никто, начиная ещё с первого поста, не посоветовал візвать mysql_error или привести полностью сформированный SQL-запрос? тренировка телепатов?

Автор: QaaZ 15.10.2008, 21:09
mysqli_error ошибок не выводит.

Запрос который должен выполнятся :

Код

INSERT INTO `login` (`Username`, `Password`, `Gender`,`IsActivated`, `DateOfBirth`, `DateOfRegistration`) VALUES ('$login', '$passwd', '$sex', '1', '$date', '$reg_date')




Вот такой код :

Код

// Подключаемся к БД
@$dbconnect = new mysqli(
                        "$dbhost",
                        "$dbuser",
                        "$dbpass",
                        "$dbname");


    if (!$dbconnect) {
                         echo "<br>Неудалось подключиться к базе данных.";
                     }
                    
                    
$login = $dbconnect->real_escape_string($_POST['login']);
$pass1 = $dbconnect->real_escape_string($_POST['pass1']);
$pass2 = $dbconnect->real_escape_string($_POST['pass2']);
@$sex = $dbconnect->real_escape_string($_POST['sex']);
$date = date('D-M-Y');
$reg_date = date('D-M-Y');
$passwd = md5($pass1);

echo "</div>";

$mysqli = new mysqli("$dbhost", "$dbuser", "$dbpass", "$dbname");
if (mysqli_connect_errno()) {
    echo "Ошибка"; exit();
}
$sql = "INSERT INTO `login1` (`Username`, `Password`, `Gender`,`IsActivated`, `DateOfBirth`, `DateOfRegistration`) VALUES ('$login', '$passwd', '$sex', '1', '$date', '$reg_date')";
if ($mysqli->query($sql)) {
   echo "Все ОК";
}


/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

if (!$dbconnect->query("SET a=1")) {
    printf("Errormessage: %s\n", $dbconnect->error);
}

/* close connection */
$mysqli->close();


Выводит: 

Код

Errormessage: Unknown system variable 'a'

Автор: unicross 15.10.2008, 21:10
QaaZ, вы не правильно вставляете дату

Код

$date = date('D-M-Y');


Это не правильно! Дата должна быть типа 2008-10-15

Воспользуйтесь функцией CURDATE():

Код

$sql = "INSERT INTO `login` (`Username`, `Password`, `Gender`,`IsActivated`,  `DateOfBirth`, `DateOfRegistration`)  VALUES ('$login', '$passwd', '$sex', 1, CURDATE(), CURDATE())";


Кроме того, вставляемые данные должны быть уникальными. Значит надо делать проверку перед вставкой!

Автор: QaaZ 15.10.2008, 21:11
Цитата

Кроме того, вставляемые данные должны быть уникальными. Значит надо делать проверку перед вставкой!


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


Цитата

QaaZ, вы не правильно вставляете дату


Спасибо. smile

Автор: unicross 15.10.2008, 21:17
Этот код работает без проблем. Если данные уникальные!!!

Код

$mysqli = new mysqli("localhost", "root", "", "saga_login");
if (mysqli_connect_errno()) {
    echo "Ошибка"; exit();
}
$login = "Надя3";
$pass1 = "123";
$pass2 = "123";
$sex   = "1";
$passwd = md5($pass1);
$sql = "INSERT INTO `login` (`Username`, `Password`, `Gender`,`IsActivated`,  `DateOfBirth`, `DateOfRegistration`)  VALUES ('$login', '$passwd', '$sex', 1, CURDATE(), CURDATE())";
if ($mysqli->query($sql)) {
   echo "Все ОК";
}
$mysqli->close();

Автор: QaaZ 15.10.2008, 21:20
unicross, УРА!! )) Спасибо большое, заработало наконец-то. smile

Автор: bobik02 15.10.2008, 21:32
QaaZ, не понимаю чему тут радоваться. http://forum.vingrad.ru/index.php?showtopic=232338&view=findpost&p=1669396

Все же тут есть правила, если вопрос решён помечайте его как решённым !

Автор: unicross 15.10.2008, 21:36
Цитата

unicross, УРА!! )) Спасибо большое, заработало наконец-то.


 smile 

Вот еще код, уже с формой

Код

<form method="POST">
<input type="text" name="login"><BR>
<input type="text" name="pass1"><BR>
<input type="text" name="pass2"><BR>
<input type="radio" name="sex" value=1 CHECKED>M<BR>
<input type="radio" name="sex" value=2>Ж<BR>
<input type="submit">
</form>
<?php
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "";
$dbname = "saga_login";
if (!$_POST['login']) { echo "Необходимо ввести данные"; exit(); }
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if (mysqli_connect_errno()) {
    echo "Ошибка"; exit();
}
$login = $mysqli->real_escape_string($_POST['login']);
$pass1 = $mysqli->real_escape_string($_POST['pass1']);
$pass2 = $mysqli->real_escape_string($_POST['pass2']);
$sex = $mysqli->real_escape_string($_POST['sex']);
$passwd = md5($pass1);
$sql = "INSERT INTO `login` (`Username`, `Password`, `Gender`,`IsActivated`,  `DateOfBirth`, `DateOfRegistration`)  VALUES ('$login', '$passwd', '$sex', 1, CURDATE(), CURDATE())";
if ($mysqli->query($sql)) {
   echo "Все ОК";
}
else {
   echo "Проблемы";
}
$mysqli->close();

?>

Автор: QaaZ 15.10.2008, 21:39
Вопрос решён, всем спасибо за помощь.

P.S. Формы у меня уже есть. smile

Автор: skyboy 15.10.2008, 21:48
Цитата(QaaZ @  15.10.2008,  20:09 Найти цитируемый пост)
Запрос который должен выполнятся :

нет, запрос, который выполняется, не может содержать PHP-переменные. Это только текст. И если бы ты вывел его, а не смесь с PHP-кодом, то либо сам заметил бы сразу ошибки, либо люди тебе подсказали бы. Вторым сообщением в этой теме.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)