php - 创建简单表时出现 mySQL 语法错误

标签 php mysql linux

最近因为工作原因从linux换成了windows,之前mysql中php建表的方式好像不行了。

我首先尝试使用一些 php 变量创建表:

$tablename=$_POST['tablename'];
$fields=array('First Name', 'Last Name', 'Institution', 'Abbr.', 'City', 'Country', 'Phone', 'Email', 'Found by', 'Salesperson', 'Temp', 'Notes');

$sql ="CREATE TABLE $tablename
  (
  PID INT NOT NULL AUTO_INCREMENT,";
foreach ($fields as $field){$sql .= " $field CHAR(50),";}
$sql .= "PRIMARY KEY(PID))";

if (mysqli_query($con,$sql))
  {echo "Table persons created successfully";}
else
  {echo "Error creating table: " . mysqli_error($con);}

它返回了错误:“你的 SQL 语法有错误;请检查与你的 MySQL 服务器版本对应的手册,了解在 '( PID INT NOT NULL AUTO_INCREMENT, FirstName NOT NULL CHAR(50) 附近使用的正确语法, LastNam' 在第 2 行"

我认为空格可能有问题,所以我尝试手动输入表格数据:

$sql="CREATE TABLE $tablename
  (
  PID INT NOT NULL AUTO_INCREMENT,
  FirstName NOT NULL CHAR(50),
  LastName NOT NULL CHAR(50),
  Institution NOT NULL CHAR(50),
  Abbr NOT NULL CHAR(50),
  City NOT NULL CHAR(50),
  Country NOT NULL CHAR(50), 
  Phone NOT NULL CHAR(50), 
  Email NOT NULL CHAR(50), 
  Foundby NOT NULL CHAR(50),
  Salesperson NOT NULL CHAR(50),
  Temp NOT NULL CHAR(50),
  Notes NOT NULL CHAR(50),
  PRIMARY KEY(PID))";

Bu 返回相同的错误消息。我已经尽力根据以前的建议以各种方式修改它,但我被卡住了。与第二个示例格式几乎完全相同的表格在我的 Linux 机器上完美运行......

最佳答案

NOT NULL 应该跟在列类型之后

例如它应该是:

FirstName CHAR(50) NOT NULL

但是你把它写成:

FirstName NOT NULL CHAR(50)

这对我有用:

CREATE TABLE test_table
(
    PID INT NOT NULL AUTO_INCREMENT,
    FirstName  CHAR(50) NOT NULL,
    LastName CHAR(50) NOT NULL,
    Institution CHAR(50) NOT NULL,
    Abbr CHAR(50) NOT NULL,
    City CHAR(50) NOT NULL,
    Country CHAR(50) NOT NULL, 
    Phone CHAR(50) NOT NULL, 
    Email CHAR(50) NOT NULL, 
    Foundby CHAR(50) NOT NULL,
    Salesperson CHAR(50) NOT NULL,
    Temp CHAR(50) NOT NULL,
    Notes CHAR(50) NOT NULL,
    PRIMARY KEY(PID)
)

您的代码看起来可以很好地为 CREATE TABLE 生成 SQL,但是由于您的列名有空格,您需要使用反引号:

$tablename = 'persons';

$fields = array('First Name', 'Last Name', 'Institution', 'Abbr.', 'City', 'Country', 'Phone', 'Email', 'Found by', 'Salesperson', 'Temp', 'Notes');

$sql = "CREATE TABLE `".$tablename."`
(
    `PID` INT NOT NULL AUTO_INCREMENT,";
foreach( $fields as $field )
{
    $sql .= "
    `" .$field ."` CHAR(50) NOT NULL,";
}
$sql .= "
    PRIMARY KEY(PID)
)";

echo $sql;

将给予:

CREATE TABLE `persons`
(
    `PID` INT NOT NULL AUTO_INCREMENT,
    `First Name` CHAR(50) NOT NULL,
    `Last Name` CHAR(50) NOT NULL,
    `Institution` CHAR(50) NOT NULL,
    `Abbr.` CHAR(50) NOT NULL,
    `City` CHAR(50) NOT NULL,
    `Country` CHAR(50) NOT NULL,
    `Phone` CHAR(50) NOT NULL,
    `Email` CHAR(50) NOT NULL,
    `Found by` CHAR(50) NOT NULL,
    `Salesperson` CHAR(50) NOT NULL,
    `Temp` CHAR(50) NOT NULL,
    `Notes` CHAR(50) NOT NULL,
    PRIMARY KEY(PID)
)

上面的 SQL 创建的表没有任何问题。

关于php - 创建简单表时出现 mySQL 语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19439155/

相关文章:

mysql/javaexecuteUpdate如何返回匹配的行和更新的行

mysql - 当 ID 是另一列的一小部分时,如何选择对象?

mysql - 如何在 mysql 中使用 order by 捕获特定行的邻居?

linux - Linux 中的绝对路径和相对路径

linux - 根据字典替换事件代码的 Shell 命令

php - 为什么这段使用 MySQLi 的代码抛出 PHP Notice : trying to get property of non-object

php - Count Doctrine 的 iterate() Collection Result

php - CakePHP:删除数据库表中的冗余

php - 如果列表中存在特定变量或单词,如何使用 PHP 隐藏 smth

linux - 升压 asio 套接字不断弹出/proc/pid/fd