2013-09-02 2 views
0

У меня проблема, отправив multi_query в мою базу данных MySQL. Я хочу, чтобы получить содержимое файла и отправить его в базу данных с помощью нескольких запросовMySQLi multi_query не работает

Я сделал MySQLi класс с этим методом в нем:

public function multi_query($resource) 
    { 
     $Timer = microtime(true); 
     if($this->MySQLiObj->multi_query($resource)) 
     { 
      do { 
       if ($result = $this->MySQLiObj->store_result()) 
        $result->free(); 

       $this->queryCount++; 

       if(!$this->MySQLiObj->more_results()){break;} 

      } while ($this->MySQLiObj->next_result());  
     } 

     $this->SQL[] = $resource; 

     if ($this->MySQLiObj->errno) 
     { 
      if($this->MySQLiObj->error == true) { 
       echo "SQL Error: ".$this->MySQLiObj->error."<br><br>Query Code: ".$resource; 
      } else { 
       return "SQL Error: ".$this->MySQLiObj->error; 
      } 
     } 
    } 

Вот я его с помощью:

$mysqli = new \System\Database\MySQLi($_SESSION["server"], $_SESSION["username"], $_SESSION["password"], $_SESSION["database"], $_SESSION["port"]); 
    echo $mysqli->multi_query(file_get_contents('install.sql')); 

А вот мой .sql файл:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 


/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8 */; 

CREATE TABLE `t_User` 
(
    `p_ID` INT(11) UNSIGNED AUTO_INCREMENT, 
    `m_Firstname` VARCHAR(75) NOT NULL, 
    `m_Surename` VARCHAR(150) NOT NULL, 
    `m_Email` VARCHAR(255) NOT NULL UNIQUE, 
    `m_Password` VARCHAR(65) NOT NULL, 
    `m_ActivationCode` VARCHAR(36) NOT NULL UNIQUE, 
    `m_Activated` BIT DEFAULT 0, 
    `m_Online` BIT DEFAULT 0, 
    `m_LastActivity` DATETIME, 
    `m_Birthdate` DATE, 
    `m_ProfilPicture` VARCHAR(255), 
    `m_SchoolID` INT(11), 
    `m_AddressID` INT(11), 
    `m_IsAdmin` BIT DEFAULT 0, 
    PRIMARY KEY (`p_ID`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

CREATE TABLE `t_School` 
(
    `p_ID` INT PRIMARY KEY AUTO_INCREMENT, 
    `m_Name` VARCHAR(150) UNIQUE NOT NULL, 
    `m_Description` VARCHAR(255), 
    `m_Homepage` VARCHAR(150) UNIQUE, 
    `m_AddressID` INT, 
    `m_ManagerID` INT NOT NULL UNIQUE 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

А вот моя ошибка:

Ошибка SQL: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «SET SQL_MODE =« NO_AUTO_VALUE_ON_ZERO »;/*! 40101 SET @OLD_CHARACTER_SET_CL 'по строке 1

Не имеет значения, удалю ли я первую первую строку. И я также попытался скопировать содержимое файла в php-переменную ... но он тоже не работает.

Надежда кто-нибудь может мне помочь:/

+0

дикое предположение. у вас нет подписи BOM в верхней части вашего файла? –

+0

Что такое подпись спецификации? –

+0

позвольте мне сообщить, что для вас: http://google.com/search?q=BOM+signature –

ответ

3

Говоря mysqli_multi_query, он работает хорошо для меня:

$q = <<<HERE 
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8 */; 

CREATE TABLE `t_User` 
(
    `p_ID` INT(11) UNSIGNED AUTO_INCREMENT, 
    `m_Firstname` VARCHAR(75) NOT NULL, 
    `m_Surename` VARCHAR(150) NOT NULL, 
    `m_Email` VARCHAR(255) NOT NULL UNIQUE, 
    `m_Password` VARCHAR(65) NOT NULL, 
    `m_ActivationCode` VARCHAR(36) NOT NULL UNIQUE, 
    `m_Activated` BIT DEFAULT 0, 
    `m_Online` BIT DEFAULT 0, 
    `m_LastActivity` DATETIME, 
    `m_Birthdate` DATE, 
    `m_ProfilPicture` VARCHAR(255), 
    `m_SchoolID` INT(11), 
    `m_AddressID` INT(11), 
    `m_IsAdmin` BIT DEFAULT 0, 
    PRIMARY KEY (`p_ID`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
HERE; 

$m = mysqli_connect('localhost','test','aaa','test'); 
$m->multi_query($q); 
var_dump($m->error); 
  • без ошибок, поднятые, таблица создана. Таким образом, эта функция, по-видимому, работает.
+0

Это тоже работает для меня ... Но в чем разница, если я пишу $ q = <<< ЗДЕСЬ ... sql ... ЗДЕСЬ; И когда я пишу $ q = file_get_contents ('install.sql'); Он просто выиграл ' t работать так:/ –

+1

, тогда вы должны сравнить эти 2 текста. Вывести их в urlencode, сравнить длины и т. д. –

+0

okey ... теперь я знаю проблему ... В начале строки из файла есть подпись BOM ...% EF% BB% BF , поэтому я подставляю строку и, наконец, ее работу ^^ $ m-> multi_query (substr (file_get_contents ('install.sql')), 3); Я не знаю, если это лучший способ сделать это ... но он работает ... Спасибо за помощь, отладочную мою проблему! –

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