2013-09-23 67 views
-1

我正在重写我的PHP代码为mysql数据库访问(现在使用类定义)。虽然我有旧的代码(使用旧式函数)工作,但我努力获得用于创建表的代码 - 我认为这个问题特别与sql语句的正确定义有关,请参阅下面的代码。与旧代码相比,新的方面是,sql table creation命令现在必须包含与为其设置PDO连接(在类构造函数中)的master_database不同的数据库名称。与PDO失败的MySQL表创建

我看着http://dev.mysql.com/doc/refman/5.6/en/create-table.html(我使用mysql v5.6) - 以“表名称可以指定为db_name.tbl_name ...”为开头的部分,但是我无法获得sql语法。如果我是正确的SQL语法是错误的什么应该是正确的语法在下面的代码$ sql(使用各种变量的构造)?

Thnx提前为您提供帮助。

简化代码:

<?php 
define('DB_HOST', '***'); 
define('DB_NAME', 'MASTER_DATABASE'); //different name 
define('DB_USER', 'root'); 
define('DB_PASS', '*****'); 

//class definitions 
class Database { 

private $_db = null; //databasehandler 

public function __construct() { 

    try { 
     $this->_db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS, array( 
      PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true 
     )); 
     $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     $this->_db->query('SET CHARACTER SET utf8'); 
    } catch (PDOException $e) { 
     exit('Error while connecting to database.'.$e->getMessage()); 
    } 
} 

private function printErrorMessage($message) { 
    echo $message; 
} 


public function createDBTable($dbname,$dbtable,$tablestructure) { 
    try { 
     $sql = "CREATE TABLE `".$dbname."'.'".$dbtable.$tablestructure; //NOT CORRECT YET 
     $success = $this->_db->exec($sql); 
     return ($success > 0) ? true:false; 
    } 
    catch(PDOException $e){   
     $this->printErrorMessage($e->getMessage()); 
    } 
} 
}//class 


//code using class defs 
$dbname = 'Mydatabase'; //just an existing database 
$dbtable = 'Persons'; 
$tablestructure = '(FirstName CHAR(30),LastName CHAR(30),Age INT)'; 

$mydb = new Database(); 

if($mydb->createDBTable($dbname,$dbtable,$tablestructure)){ 
echo 'table creation success'; 
} 
else{ 
echo 'table creation failure'; 
} 
?> 
+0

您是否尝试使用errorInfo获取失败原因? – GordonM

+0

您必须使用反引号打开_and_关闭每个虚线组件。你已经打开了反引号,但用一个单引号关闭。 –

+0

使用'createDBTable()'函数有什么意义?在调用它的时候保存自己*两个词*你只是将它们转移到函数名称中,介意你。在我的生活中,我永远不会理解拥有这种函数的原因,它的实际目的仅仅是*连接参数* –

回答

0

您可以替换您创建的表行: - 。 “”。 $ SQL = “CREATE TABLE” $ DBNAME $ DBTABLE “” $ tablestructure; // NOT CORRECT YET

而不是: - $ success = $ this - > _ db-> exec($ sql);

使用以下行: - $ stmt = $ this - > _ db-> prepare($ sql); $ success = $ stmt-> execute();

如果没有上述2行,$ succes变量的值将为0,尽管可以创建表,但会导致表创建失败。 希望这有助于。

+0

thnx所有评论; @theark:你的解决方案有效,我用它(不明白为什么它downvoted ...) – Joppo

+0

很高兴它的工作。这已被低估为'你的常识'试图解释这实际上是SQL语法的一个问题,它与PDO无关。 – theark