我有以下代码:
$db_host = 'localhost';
$db_port = '3306';
$db_username = 'root';
$db_password = 'root';
$db_primaryDatabase = 'dsl_ams';
// Connect to the database, using the predefined database variables in /assets/repository/mysql.php
$dbConnection = new mysqli($db_host, $db_username, $db_password, $db_primaryDatabase);
// If there are errors (if the no# of errors is > 1), print out the error and cancel loading the page via exit();
if (mysqli_connect_errno()) {
printf("Could not connect to MySQL databse: %s\n", mysqli_connect_error());
exit();
}
$queryCreateUsersTable = "CREATE TABLE IF NOT EXISTS `USERS` (
`ID` int(11) unsigned NOT NULL auto_increment,
`EMAIL` varchar(255) NOT NULL default '',
`PASSWORD` varchar(255) NOT NULL default '',
`PERMISSION_LEVEL` tinyint(1) unsigned NOT NULL default '1',
`APPLICATION_COMPLETED` boolean NOT NULL default '0',
`APPLICATION_IN_PROGRESS` boolean NOT NULL default '0',
PRIMARY KEY (`ID`)
)";
if(!$dbConnection->query($queryCreateUsersTable)){
echo "Table creation failed: (" . $dbConnection->errno . ") " . $dbConnection->error;
}
哪个输出...
Table creation failed: (1050) Table '`dsl_ams`.`USERS`' already exists
我不明白的是:如果该表已经存在,
IF NOT EXISTS
不应该取消SQL查询的执行吗?换句话说,如果表存在,它不应该退出该 if 语句并且根本不回显任何内容,并且不尝试执行查询吗?
只是试图找到“如果表不存在则创建表”的最佳方法,而不向用户输出任何内容。
社区警告:如果表不存在,下面的方法将导致您的代码失败。您应该使用常规的 CREATE TABLE IF NOT EXISTS 查询,使用正确的拼写和字母大小写作为表名,或者,如果它不起作用,请参阅本文顶部固定的问题。
试试这个
$query = "SELECT ID FROM USERS";
$result = mysqli_query($dbConnection, $query);
if(empty($result)) {
$query = "CREATE TABLE USERS (
ID int(11) AUTO_INCREMENT,
EMAIL varchar(255) NOT NULL,
PASSWORD varchar(255) NOT NULL,
PERMISSION_LEVEL int,
APPLICATION_COMPLETED int,
APPLICATION_IN_PROGRESS int,
PRIMARY KEY (ID)
)";
$result = mysqli_query($dbConnection, $query);
}
这会检查表中是否有任何内容,如果返回
NULL
,则表明您没有表。
而且mysql中没有
BOOLEAN
数据类型,您应该INT
并在插入表时将其设置为1或0。当您将数据硬编码到查询中时,您也不需要将所有内容都用单引号括起来。
像这样...
$query = "INSERT INTO USERS (EMAIL, PASSWORD, PERMISSION_LEVEL, APPLICATION_COMPLETED, APPLICATION_IN_PROGRESS) VALUES ('[email protected]', 'fjsdfbsjkbgs', 0, 0, 0)";
这篇旧文章只是展示了不良做法和不一致的答案。遗憾的是,将其作为骗子关闭并不会使其远离公众,并且它将继续其虚假信息使命。
简短的事实核查:
CREATE TABLE IF NOT EXISTS
应该 可以工作。SHOW TABLES LIKE 'Users'
查询,将行 fetch 放入变量中并查看它是否为空。 为了避免输出任何内容,请在尝试创建表之前在 php 中测试该表。例如,
$querycheck='SELECT 1 FROM `USERS`';
$query_result=$dbConnection->query($querycheck);
if ($query_result !== FALSE)
{
// table exists
} else
{
// table does not exist, create here.
}
如果错误号不是 1050,只显示错误怎么样?
if(!$dbConnection->query($queryCreateUsersTable)){
if($dbConnection->errno != 1050){
echo "Table creation failed: (" . $dbConnection->errno . ") " . $dbConnection->error;
}
}
这个将连接到mysql检查数据库是否存在。如果是,它将检查表是否存在。如果它们都不存在,它将自动创建。
$servername = "hostname";
$username = "username";
$password = "password";
$dbname = "database_name";
// Create connection
$conn = new mysqli($servername, $username, $password);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Create database
$sql = "CREATE DATABASE IF NOT EXISTS database_name";
if ($conn->query($sql) === TRUE) {
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql1 = "CREATE TABLE IF NOT EXISTS Users (ID int(11) AUTO_INCREMENT,
EMAIL varchar(255) NOT NULL,
PASSWORD varchar(255) NOT NULL,
PERMISSION_LEVEL int,
APPLICATION_COMPLETED int,
APPLICATION_IN_PROGRESS int,
PRIMARY KEY (ID))";
if($conn->query($sql1) === TRUE) {
echo "Database and Table Online";
}else{
echo "Database and Table Offline" . $conn->error;
}
} else {
echo "Error creating database: " . $conn->error;
}
$conn->close();