我想动态创建sql表 我知道创建新表的语法是
CREATE TABLE MyTab (mycolumn VARCHAR(30))
但我想用用户输入来决定表的名称和列名。 我试着这样做
PHP:
<?php
$newTab=$_POST['user_input'];
$myCol=$_POST['user_column'];
$conn = new mysqli(my server,username,password,db);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql="CREATE TABLE $newTab ($myCol VARCHAR(30))";
?>
HTML:
<!doctype html>
<head>
</head>
<body>
<form name="user" action="my.php" Method="POST">
<button onCLick="user_f();" type="button">Submit</button>
<input type="hidden" name="user_input"></input>
<input type="hidden" name="user_column"></input>
</form>
</body>
</html>
这是一个非常简单的html页面,我只想测试我想做的事情。
JS:
user_f(){
var x=prompt('tell me...');
var y=prompt('say to me...');
document.user.user_input.value=x;
document.user.user_column.value=y;document.user.submit();}
返回的错误是这个&#34;注意:未定义的索引:newTab&#34; 我可以通过哪种方式解决这个问题? 谢谢 我试着解释一下我想做什么。 我想用SQL创建一个表。 但是对于create table我必须使用这种语法
CREATE TABLE myTab (first VARCHAR(30),second VARCHAR(30));
但是为了确定表的名称,我必须在我的文件中分配它。 我希望这个名字是由用户而不是我建立的。为此,我使用输入(此输入在表单中,它们在隐藏的输入中),当我在输入中提交此值时,使用$ _POST我抓住了它,我想把这个值放在表的名称中。 像这样的东西
JS x=prompt("select the name of the table");
SQL CREATE TABLE x (first VARCHAR(30),second VARCHAR(30));
错误仍然存在...... 希望你能忍受我。我说英语非常抱歉对所有人。
答案 0 :(得分:2)
您的代码存在一些问题。
首先,有这个块:
$newTab=$_POST['user_input'];
$myCol=$_POST['user_column']
$sql="CREATE TABLE $newTab ($myCol VARCHAR(30));"
如果以上是您的实际代码(我按字面意思),您在第二行末尾缺少分号,第三行中的引号应该在之前分号。
$newTab=$_POST['user_input'];
$myCol=$_POST['user_column'];
$sql="CREATE TABLE $newTab ($myCol VARCHAR(30))";
但是,如果您的条目/条目包含SQL会抱怨的任何内容,例如空格或连字符,请使用变量周围的刻度:
$newTab=$_POST['user_input'];
$myCol=$_POST['user_column'];
$sql="CREATE TABLE `$newTab` (`$myCol` VARCHAR(30))";
假设您已经建立了数据库连接,并且根据您使用的MySQL API,需要查询数据库。
一个例子是:
$sql=mysqli_query($con,"CREATE TABLE `$newTab` (`$myCol` VARCHAR(30))");
旁注: 如果出现错误,请将or die(mysqli_error($con))
添加到mysqli_query()
。
然后你的JS中缺少“function”这个词;再次,如果那是实际代码:
function user_f(){
var x=prompt('tell me...');
var y=prompt('say to me...');
document.user.user_input.value=x;
document.user.user_column.value=y;document.user.submit();
}
完整的HTML /表单代码为:
<!doctype html>
<head>
</head>
<body>
<script>
function user_f(){
var x=prompt('tell me...');
var y=prompt('say to me...');
document.user.user_input.value=x;
document.user.user_column.value=y;document.user.submit();
}
</script>
<form name="user" action="my.php" Method="POST">
<button onCLick="user_f();" type="button">Submit</button>
<input type="hidden" name="user_input">
<input type="hidden" name="user_column">
</form>
</body>
</html>
但是,在任何情况下最好都使用isset()
。 empty()
是另一个可以用来测试是否为空的。
目前还不清楚您是在同一页面内还是在两个单独的文件中使用整个代码。
Nota:
如果你在同一个文件中使用它,那就像新手在答案中说的那样。这将解释未定义的索引通知。
正如Halfer在评论中指出的那样,你会对SQL injection开放。使用mysqli
with prepared statements或PDO with prepared statements,它们更安全。
关于这个问题,Stack上有一篇很好的文章:
修改强>
以下对我来说非常合适,使用“table_a_test”作为表名,使用“column_a_test”作为列名。
将DB凭据替换为您自己的凭据。
使用两个不同的文件。一个用于HTML表单,另一个用于表创建代码。
这是你的“my.php”文件:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$DB_HOST = 'xxx';
$DB_USER = 'xxx';
$DB_PASS = 'xxx';
$DB_NAME = 'xxx';
$db = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($db->connect_errno > 0) {
die('Connection failed [' . $db->connect_error . ']');
}
if(isset($_POST['user_input']) && isset($_POST['user_column'])){
$newTab = $_POST['user_input'];
$myCol = $_POST['user_column'];
$sql = "CREATE TABLE `$newTab` (`$myCol` VARCHAR(30))";
if(!$result = $db->query($sql)) {
die('There was an error running the query [' . $db->error . ']');
}
else {
echo "Successful query.";
}
}
/*
echo $newTab;
echo "<br>";
echo $myCol;
*/
?>
<强>诺塔:强>
$db->error
时会出现错误。编辑(根据didierc的评论,谢谢)
后退勾选键可能不位于意大利键盘映射的同一位置。
答案 1 :(得分:1)
在读取全局值之前,您的代码不会检查表单是否已提交。
1)给出一个名称来提交按钮
<button onCLick="user_f();" name="submit" type="button">Submit</button>
2)使用isset()函数包围你的php代码。
isset($_POST['submit'])
{
$newTab=$_POST['user_input'];
$myCol=$_POST['user_column'];
// other logic
}
有关isset函数here的详细信息。