查询语句中的数组用法-MySQL通过PHP


Array usage inside the query statement - MySQL via PHP

嘿,伙计们,我是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);
   ?>

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

然后,在MySQL中,slot列将被设置为auto_increment,这意味着每次向数据库中添加一行时,数字都会递增。

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

这使您的数据库具有关系性(请参阅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) . "
)";

您可以将所有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值。

<?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);
?>

此处使用的是变量,而不是直接值。请注意,文件名应该是唯一的。它不能重复。

像这样尝试

您可以像传递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 .= ')';

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

mysqli_connect(host,username,password,dbname);

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

这里还有两件事需要注意。

  1. 使用mysql_real_eescape_string函数转义变量
  2. 最好使用PDO或MySQLi,因为您正在使用的MySQL扩展已被弃用