【问题标题】:How to store an array values in MySQL table?如何在 MySQL 表中存储数组值?
【发布时间】:2016-10-19 06:57:34
【问题描述】:

表单提交的值存储在 $array 中。

$array= array("123","James","New York");

MySQL 表(客户)

ID-----NAME-----CITY

我是 PHP 新手。我想将数组数据插入到 MySQL 表中的相关列中。

mysql_query("INSERT INTO customer (ID,NAME,CITY) 
                    VALUES ('123','James','New York')" );

可以使用,但是每次提交表单时数组元素的数量可以改变。

我怎样才能使用 PHP 做到这一点?

注意:

在选择表格页面中,用户从下拉菜单中选择表格,然后加载自定义表格。所以列名取决于用户选择的表。我可以在“$array”中获取表单中提交的值。但问题是每次值的数量都在变化。

mysql_query(INSERT INTO customer VALUES ($array)); //这种格式不能用

选择表格代码

<?php
include("functions.inc");
connectDatabase();
$queryseltable= "SHOW TABLES" or die("error query");

$result=mysql_query($queryseltable);


?>

<link href="style.css" rel="stylesheet" type="text/css" />

<form action="process.php" method="post">

<div id="wrapper">

    <table>
      <tr>
        <td id="right">Select Table:</td>
        <td id="input">

        <select name="table">

        <?php

        while($row=mysql_fetch_array($result)){


            extract($row);
            echo "<option>".$Tables_in_database ."</option>";        
        }
        ?>

        </select>

        </td>
      </tr>

      <tr>
        <td></td>
        <td><input type="submit" value="Select" /></td>
      </tr>

    </table>
</div>

</form>
<?php
?>

Process.php 代码

<link href="style.css" rel="stylesheet" type="text/css" />

<form action="insert.php" method="post">

<?php

include("functions.inc");

connectDatabase();

$table= $_POST['table'];

$_SESSION['table'] = $table;

$query= "SELECT * FROM $table";

$result= mysql_query($query) or die("query failed");

$count=mysql_num_fields($result);

$fieldname = mysql_field_name($result, 0);

?>

<div id="wrapper">

    <table>

        <?php

        for($x=0; $x<$count;$x++){

                $fieldname = mysql_field_name($result, $x);
        echo "  
                <tr>
                     <td id=\"right\">$fieldname</td>
                     <td id=\"input\"><input type=\"text\" name=\"test[]\" /></td>
                </tr>
      ";


      }

      ?>
      <tr>
        <td></td>
        <td><input type="submit" value="Insert" /></td>
      </tr>

    </table>
</div>

</form>

【问题讨论】:

标签: php mysql arrays insert html-table


【解决方案1】:

使用 PDO 准备好的语句,如下所示:

$pdo = new PDO($dns); // where $dns is your connection string
$q = $pdo->prepare('INSERT INTO customer (ID, NAME, CITY) VALUES (?, ?, ?)');
$q->execute(array("123","James","New York"));

阅读here 了解 PDO

更新:

如果你真的需要这个,你可以通过 POST 传递数组,比如

<form>
    <input type="hidden" name="table[column1]" value="value1" />
    <input type="hidden" name="table[column2]" value="value2" />
    ...
    <input type="hidden" name="table[columnN]" value="valueN" />
</form>

使用命名列,因为当您知道这些列是什么时,您的表单就会生成。

在 PHP 中你会得到:

$array = $_POST['table'];
// Now, $array === array('column1' => 'value1', 'column2' => 'value2', ..., 'columnN' => 'valueN');

你可以这样做:

$pdo = new PDO($dns); // where $dns is your connection string
$q = $pdo->prepare(sprintf(
    'INSERT INTO customer (%s) VALUES (%s)',
    implode(', ', array_keys($array)), // column names separated by ', '
    implode(', ', array_fill(0, count($array), '?')) // ? marks for placing values
));
$q->execute($array);

希望对您有所帮助。 但应该知道这种方式非常不安全,请在您真正需要之前不要这样做

【讨论】:

  • 不错的智能解决方案 +1。 :)
【解决方案2】:
$insert = null;
foreach($array as $pos => $value) {
    $mysql_value = mysql_real_escape_string($value, $your_mysql_connection);
    $insert_query = ($pos > 0 ? ',', '').'\''.$mysql_value.'\'';
}

mysql_query('INSERT INTO customer (ID,NAME,CITY) 
                VALUES ('.$insert_query.')' );

【讨论】:

    【解决方案3】:

    好吧,你可以使用 array_keys()

    array array_keys ( array $input [, mixed $search_value = NULL [, bool $strict = false ]] )
    

    获取数组键,它应该与表中的字段名称相对应,

    然后使用 implode()

    string implode ( string $glue , array $pieces )
    

    将键数组转换为字符串,然后将原始数组转换为字符串以获取字段值,如下所示:

    $myArray = array('A', 'B', 'C');
    
    echo "'" . implode("','", $myArray) . "'"; //Displays 'A', 'B', 'C'
    

    然后将其插入到您的查询中:

    mysql_query("INSERT INTO customer ($keys) 
                        VALUES ($values)" );
    

    【讨论】:

      【解决方案4】:

      这很愚蠢。数组元素的数量如何变化?如果它是一个表单,那么它有一个静态数量的字段。每个字段都可以/应该对应于 MySQL 中的一个列。如果您并不总是需要所有列,则可以将它们的默认值设置为 NULL,然后在插入时省略该列。

      假设你有桌子:

      idnamecityemailfavorite_pie

      如果这些列设置为ALLOW NULL,您可以运行这些插入:

      INSERT INTO customer (id,name,city) VALUES ('123','James','New York');
      INSERT INTO customer (id,name,email) VALUES ('234','John','foo@bar.com');
      INSERT INTO customer (id,email,favorite_pie) VALUES ('345','Carl','Cherry');
      

      所有省略的字段都将设置为NULL。


      但是如果你需要存储一个数组,你总是可以将它序列化并存储为文本。您可以在 PHP 中执行以下操作:

      serialize(array("123","James","New York"));
      

      这将产生以下字符串:

      a:3:{i:0;s:3:"123";i:1;s:5:"James";i:2;s:8:"New York";}
      

      您可以将该字符串保存在文本或 varchar 字段中。检索后,您可以像这样反序列化它以获取数组:

      $myArray = unserialize($theString);
      

      希望有帮助

      【讨论】:

        【解决方案5】:

        您可以循环遍历数组,如下所示:-

        $array= array("123","James","New York");
        for ($i = 0; $i < 25; $i++)
            {
                $id = $array[$i][5];
                $name = $array[$i][10];
                $city = $array[$i][13];
        
                // Run query using the variable values rather than the array values.
                   mysql_query("INSERT INTO customer (ID,NAME,CITY) 
                               VALUES ($id,$name,$city)" );
        
            }
        

        【讨论】:

          【解决方案6】:

          如果您确定数组与列匹配,可能是这样的:

          // The array previously filled somewhere above, having currently these values
          
          $array = array("123","James","New York");
          
          // Escaping values
          for($i = 0; $i < count($array); $i++)
              $array[$i] = "'{$array[$i]}'";
          
          
          mysql_query("INSERT INTO customer (ID,NAME,CITY) 
                          VALUES (" . implode(', ', $array) . ")" );
          

          但是,这可能会导致安全问题。

          【讨论】:

          • 请先转义你的字符串以获得 +1
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-04-15
          • 2020-11-18
          • 1970-01-01
          • 2015-08-10
          • 2011-03-10
          相关资源
          最近更新 更多