Php 如果表不存在,则创建表失败,因为表已存在
我有以下代码:Php 如果表不存在,则创建表失败,因为表已存在,php,mysql,sql,mysqli,Php,Mysql,Sql,Mysqli,我有以下代码: $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
$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语句而不回显任何内容,并且不尝试执行查询
只是想找到最好的方法“创建一个不存在的表”,而不向用户输出任何内容。为了避免输出任何内容,请在创建表之前在php中测试该表。比如说,
$querycheck='SELECT 1 FROM `USERS`';
$query_result=$dbConnection->query($querycheck);
if ($query_result !== FALSE)
{
// table exists
} else
{
// table does not exist, create here.
}
试试这个
$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 ('foobar@foobar.com', 'fjsdfbsjkbgs', 0, 0, 0)";
如果错误号不是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();
这篇老文章只是一个坏习惯和不一致答案的展示。遗憾的是,以欺骗的方式关闭它并不会使它与公众隔绝,它将继续其虚假信息的使命 简短的事实调查:
- 如果您的系统正常,则
应该可以工作创建表(如果不存在)
- 如果存在重影表,请参阅以了解补救方法
- 若要检查表是否存在,从不从表中选择任何内容,将导致错误
- (然而,与许多注释中表达的错误概念相反,空表不会返回空结果。空结果意味着错误。要检查查询是否返回任何行,必须获取它们)
- 相反,运行一个
query,fetch将行放入一个变量,并查看它是否为空李>SHOW表,如“Users”
$queryCreateUsersTable=$queryCreateTable
,我会启用通知来查看此类错误。“启用通知”?什么意思?是的,总的derp在我这方面。将错误报告设置为正确的级别(error\u reporting(E|ALL | E|u STRICT);
是我在开发过程中使用的)&ini\u set(ini\u集('log\u errors',1)代码>在您的生产框中(无需向最终用户显示错误),我更新了我的问题;修复了前一个问题,但遇到了新问题。似乎是windows计算机上的问题:我会使用像“用户”一样显示表我自己。请记住,这是区分大小写的。我不是MySQL专家,但如果表存在但为空,这不会失败吗?@FrankSchmitt我也这么认为。如果表已创建但还没有任何记录呢?这段代码与问题中的代码不一样吗?只有sql查询符合他的需要。但这个问题对他不起作用。这就是问题所在,他正在使用PHP过程,可能在其他文件中,他将这些与OOP混合使用。这可能是问题所在,而不是代码本身。不,这从来都不是问题,从技术上讲,你可以自由地混合样式,尽管这当然是一种糟糕的样式