Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 创建简单表时出现mySQL语法错误_Php_Mysql_Linux - Fatal编程技术网

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

Php 创建简单表时出现mySQL语法错误,php,mysql,linux,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'); $

我最近从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服务器版本对应的手册,了解第2行的“PID INT NOT NULL AUTO_INCREMENT,FirstName NOT NULL CHAR50,LastNam”附近使用的正确语法

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

$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机器上工作得非常好…

列类型后面应该是NOTNULL

例如:

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)
)
生成用于创建表的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创建的表没有任何问题。

FirstName NOT NULL CHAR50及其后的所有行都以错误的顺序写入

它应该是{column_name}{datatype}{options},但是{datatype}和{options}的形式正好相反

所以把一切都安排好 FirstName CHAR50不为空 它应该会起作用


您的PID格式正确

这是危险代码,用户可以将任何内容作为表名。字段名不正确。请注意保留字,最好在表名和列名周围使用反勾号。另外:如果你回显你的$sql,你会看到一个表名的什么?我将是目前唯一一个使用这段代码的人,所以没有真正的危险。我还限制了什么可以作为表名输入。@Wrikken回显$sql将$sql的整个输入作为字符串生成,这并不奇怪。看来是@Uours的建议起了作用。谢谢