1

嘿伙计们,我是 PHP 新手,但我试了一下。现在对我所做的工作的要求发生了变化。B1 到 B11 的值不再相同。它可以是从 B1 到 B6 或 B1 到 B50。所以我可以说我需要一个数组来传递值。但是我需要知道的是如何将它们包含在 $sql 语句中。我必须使用任何变量而不是 B1 到 B11 吗?以下是参考代码。任何帮助将不胜感激。

    <?php

    $DB_hostname = "localhost";
    $DB_Name = "root";
    $DB_pass = "pass123";


    if(isset($_GET["slot"])){
       $tableName = $_GET["slot"];
       $db = $_GET["db"];
    }
     echo $tableName;

   $con = mysql_connect($DB_Hostname,$DB_Name,$DB_pass) or die(mysql_error());

   // Create table
   mysql_select_db($tableName = $_GET["slot"];, $con);
   if(mysql_num_rows(mysql_query("SHOW TABLES LIKE $tableName"))==1) {
      echo "Table exists";
   }else {

       echo "Table does not exist";
    // Create table
    mysql_select_db($db, $con);
    $sql = "CREATE TABLE $tableName
    (
    Slot int NOT NULL,
    PRIMARY KEY(Slot),
    B1 TEXT NOT NULL,
    B2 TEXT NOT NULL,
    B3 TEXT NOT NULL,
    B4 TEXT NOT NULL,
    B5 TEXT NOT NULL,
    B6 TEXT NOT NULL,
    B7 TEXT NOT NULL,
    B8 TEXT NOT NULL,
    B9 TEXT NOT NULL,
    B10 TEXT NOT NULL,
    B11 TEXT NOT NULL
   )";
   mysql_query($sql,$con);

   }


   mysql_close($con);
   ?>
4

6 回答 6

1

您可以将所有 B1、B2 值放在一个数组中,然后$sql像这样创建您的变量。这适用于任意数量的条目。

<?php
$values=array();
$values[]="B1";
$values[]="B2";
$values[]="B3";
$values[]="B4";

$sql = "CREATE TABLE $tableName
    (
    Slot int NOT NULL,
    PRIMARY KEY(Slot)";

    foreach($values as $value)
    {
    $sql.=",
    $value TEXT NOT NULL";
    }
    $sql.=")";


echo $sql;

?>

您还可以进一步简化它。如果这些值总是以 B 开头并以数值结尾,那么您可以简单地运行一个$count变量并循环多次并添加它,而不必在数组中手动​​键入所有 B 值。

于 2013-03-07T06:55:30.263 回答
1

像这样试试

您可以像 IP/file.php?db=dbname&my_arr=B1,B2,B3 一样传递数组

$my_cols = explode(',', $_GET['my_arr']);
$sql = "CREATE TABLE $tableName     (
Slot int NOT NULL,
PRIMARY KEY(Slot)";
foreach($my_cols as $col){
    $sql .= " ,`".$col."` TEXT NOT NULL";
}
$sql .= ')';
于 2013-03-07T06:57:50.150 回答
1

我不太清楚为什么你需要在你的表中有这么多列。更好的解决方案可能是让 $tableName 只有两列,一列用于插槽,另一列定义表将具有多少个插槽。

然后该slot列将设置为auto_incrementMySQL 内部,这意味着每次将一行添加到数据库时,数字都会增加。

下一个表将包括最初在其他列中的所有数据。它将具有三列,即slot列、position列(将替换原始表中的 B$x 列)和value放置 TEXT 数据的列。

这使您的数据库具有关系(请参阅http://en.wikipedia.org/wiki/Relational_model

然后,您可以在两个表上执行 LEFT JOIN 以检索所有数据 ( http://www.w3schools.com/sql/sql_join.asp )


话虽如此,对于您当前的解决方案,您只需要更改一些代码。

if(isset($_GET["slot"])){
   $tableName = $_GET["slot"];
   $db = $_GET["db"];
}
   
//getting the slot count
if (isset($_GET['slots'])) {
   $slots = (int)$_GET['slots'];
}

if (!isset($slots) or !isset($tableName)) {
   echo "Please first provide the right data to this script!";
   exit;
}

// Create the table
$_columns = array();
for ($i = 1; $i <= $slots; $i++) {
    $_columns[] = "B$i TEXT NOT NULL ";
}

$sql = "CREATE TABLE $tableName
(
Slot int NOT NULL,
PRIMARY KEY(Slot),
" . implode( ', ', $_columns) . "
)";
于 2013-03-07T07:02:36.957 回答
1
<?php
$con = mysql_connect("localhost", "root", "12345678") or die(mysql_error());
$tableName="new_table";
// Create table
mysql_select_db("spend_track", $con);
if (mysql_num_rows(mysql_query("SHOW TABLES LIKE $tableName")) == 1) {
  echo "Table exists";
} else {

  // Create table
  mysql_select_db($db, $con);
  $sql = "CREATE TABLE $tableName
    (
    Slot int NOT NULL,
    PRIMARY KEY(Slot),
    $filed1 TEXT NOT NULL,
    $filed2 TEXT NOT NULL,
    $filed3 TEXT NOT NULL,
    $filed4 TEXT NOT NULL,
    $filed5 TEXT NOT NULL,
    $filed6 TEXT NOT NULL,
    $filed7 TEXT NOT NULL,
    $filed8 TEXT NOT NULL,
    $filed9 TEXT NOT NULL,
    $filed10 TEXT NOT NULL,
    $filed11 TEXT NOT NULL
   )";
 if(mysql_query($sql, $con)){
   echo "success to create";
 }else{
   echo "failed to create";
 }
}


mysql_close($con);
?>

这里使用变量而不是直接值。请注意,文件名必须唯一,不能重复。

于 2013-03-07T07:02:50.187 回答
0

您在连接字符串中缺少用户信息。它应该像

mysqli_connect(host,username,password,dbname);
于 2013-03-07T06:57:42.463 回答
0

我不得不承认这个问题绝对不清楚。你想让我做什么?插入新记录?创建表?等等,我们为什么要知道一些需求已经改变,我们不知道原来的需求;)

这里还有两点需要注意。

  1. 使用mysql_real_escape_string函数转义变量。
  2. 最好使用PDOMySQLi,因为您使用的 MySQL 扩展已被弃用。
于 2013-03-07T06:59:22.027 回答