从数据数组(php,mysql)编写循环sql查询

Posted

技术标签:

【中文标题】从数据数组(php,mysql)编写循环sql查询【英文标题】:Write loop sql query from data array (php, mysql) 【发布时间】:2015-11-07 09:58:46 【问题描述】:

我的 php 脚本有问题。

我有一个数组,它是从表单生成的,其中$_POST['store'] 是一个来自 jQuery 表单的数组,具有添加多行的功能:

 Array
(
    [client] => 
    [darvad] => 
    [owca] => 
    [ldrive] => 
    [store] => Array
        (
            [product] => Array
                (
                    [0] => 430
                    [1] => 440
                    [2] => 430
                )

            [quantity] => Array
                (
                    [0] => 123
                    [1] => 1223
                    [2] => 232
                )

            [segums] => Array
                (
                    [0] => Mixed park
                    [1] => Light vehicle
                    [2] => Trucks
                )

            [deadline] => Array
                (
                    [0] => 2015-08-04
                    [1] => 
                    [2] => 
                )

            [renewal] => Array
                (
                    [0] => 1
                )

        )

)

我需要从这个数组中获取值到 sql 插入语句中并循环它。

$sql_rec = "INSERT INTO tsales_funnel_mrecord (product, quantity, segums, deadline) VALUES (...),(...),(...).... ";

html 代码:

            <div id="container">
            <div id="content" role="main">

            <?php
                echo "<pre>";
                print_r($_POST);
                echo "</pre>";
            ?>

<form action="<?= $_SERVER['REQUEST_URI'] ?>" method="post" id=multiForm>  
    <label for="client">Klients: *</label><input id="client" type="text" name="client" placeholder="Reg.nr | Pk.kods" value=""  /></br>
    <label for="selector1">Darījuma vadītājs: *</label>
    <select id="selector1" name="darvad" >
        <option value="">-Dar. vadītājs-</option>
<?php 
    $sql = "SELECT Vards_Uzvards, Tables_ID FROM users";
    $results = $wpdb->get_results($sql);  // return an object, not ARRAY_N
if ($results) 
    foreach ($results as $row) 
        echo "<option value = '".$row->Tables_ID."'>".$row->Vards_Uzvards."</option>"; 

    echo "</select></br>";                          
?>
<label for="owcafind"><a href="<?php echo site_url('/sample-page/owca/'); ?>" target="_blank">Meklēt OWCA kodu:</a> *</label><input id="owcafind" type="text" name="owca" placeholder="OWCA Kods (8)" value=""  /></br>

<label for="ldrive">Mape L diskā:</label><input id="ldrive" type="text" name="ldrive" placeholder="Mape L diskā" value="" /></br>

Produkti:  <a href="#" class="addRow"><img src="<?php echo site_url('/img/plus-icon.png'); ?>" ></a><br/>
<table class="multi">
<!-- table title -->
<tr><th>Produkts</th><th>Vienību skaits</th><th>Riska segums:</th><th>Deadline:</th><th>Atjaunojums</th><th>[Option]</th></tr>
<!-- row template, when added new row -->
<tr style="display:none;" class="templateRow">
<td><select name="store[product][]">
<option value="" selected="selected">-Produkts-</option>
<option value="430">OCTA</option>
<option value="440">KASKO</option>
</select></td>
<td><input type="text" name="store[quantity][]" /></td>
<td><select name="store[segums][]">
<option value="" selected="selected">-Riska segums-</option>
<option value="Mixed park">Mixed park</option>
<option value="Light vehicle">Light vehicle</option>
<option value="Trucks">Trucks</option>
<option value="Buss">Buss</option>
</select></td>
<td><input type="date" name="store[deadline][]" class="datepicker" /></td>
<td><input type="checkbox" name="store[renewal][]" value="1" /></td>
<td><a class="del" href="#"><img src="<?php echo site_url('img/minus-icon.jpg'); ?>" ></a></td>
</tr>
<!-- default values -->
<tr>
<td><select name="store[product][]" >
<option value="" selected="selected">-Produkts-</option>
<option value="430">OCTA</option>
<option value="440">KASKO</option>
</select></td>
<td><input type="text" name="store[quantity][]"  /></td>
<td><select name="store[segums][]">
<option value="" selected="selected">-Riska segums-</option>
<option value="Mixed park">Mixed park</option>
<option value="Light vehicle">Light vehicle</option>
<option value="Trucks">Trucks</option>
<option value="Buss">Buss</option>
</select></td>
<td><input type="date" name="store[deadline][]" class="datepicker"  /></td>
<td><input type="checkbox" name="store[renewal][]" value="1" /></td>
<td></td>
</tr>
<!-- /default values -->
</table>

【问题讨论】:

那么你尝试的结果是什么?任何可以帮助我们的错误消息? 数据是如何存储的? "VALUES (...),(...),(...).... ";" - 这可能只是一个大长字符串中的 "0, 1, 2, 3, 4" 的值? 表单看起来像:s12.postimg.org/t4shn4mml/form_example.png @АлексИльин 检查我答案中的底部示例。应该涵盖这个。 【参考方案1】:

如果 Array 被称为 $array,那么您可以像这样访问数组值;

// product;
$array['store']['product'];
// quantity;
$array['store']['quantity'];
// etc.

然后,如果他们要进入单个列(这是不好的形式,我不推荐,那么你可以这样做;

// product;
$prod_string = '';
foreach ($array['store']['product'] as $key => $prod) 
  $prod_string .= $prod;

然后您可以在查询中使用$prod_string

或者,如果您需要为每个键插入一行;

// We use the key from the product loop to get the others;
foreach ($array['store']['product'] as $key => $prod) 
  $prod_val = $prod;
  $qty_val = !empty($array['store']['quantity'][$key]) ? $array['store']['quantity'][$key] : '';
  $seg_val = !empty($array['store']['segums'][$key]) ? $array['store']['segums'][$key] : '';
  $dl_val = !empty($array['store']['deadline'][$key]) ? $array['store']['deadline'][$key] : '';
  // Right here create your query and insert.
  $sql_rec = "INSERT INTO tsales_funnel_mrecord (product, quantity, segums, deadline) VALUES ($prod_val, $qty_val, $seg_val, $dl_val);"
  // I'm not sure what library you're using for your db management, so will leave that out. 

然后你将拥有每个的价值。

注意 - 我没有检查干净的帖子值。即,净化输入。这超出了这个问题的范围。

【讨论】:

尝试运行您的代码,出现错误:警告:为 foreach() 提供的参数无效 也许你应该用你正在运行的确切代码来更新你的问题。请记住,警告不是错误,代码执行不会停止。 我已经用 html 代码更新了我的问题。我试过插入 $array = $_POST;在你的代码之前。几乎完成了。有错误:INSERT INTO tsales_funnel_mrecord (Product_type, Vien_skaits, Riska_segums, Deadline) VALUES (440, 2321, Light vehicle, 2015-08-07);您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以在第 1 行的“车辆,2015-08-07)”附近使用正确的语法 虽然我的代码在查询中可能存在问题,但我真的建议您搜索堆栈溢出以查找有关将帖子数据插入数据库的问题。我担心你会插入未经处理的数据。你真的在问一个完整的方法,这一切都已经涵盖了。 已完成代码,我将其发布为答案。感谢您的帮助!【参考方案2】:

从你的问题看来,这就是你所追求的

$itemCount = sizeof($array['store']['product']);

for ($i = 0; $i < $itemCount; $i++) 
    $sql_rec = "INSERT INTO tsales_funnel_mrecord (product, quantity, segums, deadline) VALUES ("' . $array['store']['product'][$i] . '", "' . $array['store']['quantity'][$i] . '", "' . $array['store']['segums'][$i] . '", "' . $array['store']['deadline'][$i] . '");";

    // Run the sql statement on the database here

在存储到数据库之前,您需要确保所有用户提供的值都已正确转义。

【讨论】:

我有一个错误,$itemCount 返回 0,并且代码不起作用。 确保用户提供的数据被转义。使用准备好的语句:)【参考方案3】:

已经做到了:

if ($_SERVER['REQUEST_METHOD'] == 'POST')      
// We use the key from the product loop to get the others;
$array = $_POST;
$itemCount = sizeof($array['store']['product']);
// Loop through all $itemCount
$values_string = '';
for ($i = 0; $i < $itemCount; $i++) 
    $prod = esc_sql($array['store']['product'][$i]);
    $quant = esc_sql($array['store']['quantity'][$i]);
    $seg = esc_sql($array['store']['segums'][$i]);
    $deadline = esc_sql($array['store']['deadline'][$i]);
    $renewal = esc_sql($array['store']['renewal'][$i]);
    if ($i < $itemCount - 1) 
    $new_str = "('".$prod."','".$quant."','".$seg."','".$deadline."','".$renewal."'),";
     else
    $new_str = "('".$prod."','".$quant."','".$seg."','".$deadline."','".$renewal."');";
    
    $values_string .= $new_str;

// Run the sql statement on the database here
$sql_rec = "INSERT INTO tsales_funnel_mrecord (Product_type, Vien_skaits, Riska_segums, Deadline, Atjaunojums) VALUES $values_string";
$wpdb->query($sql_rec); 

【讨论】:

正如我在回答中的 cmets 中所说,esc_sql() 无法防止注入攻击。

以上是关于从数据数组(php,mysql)编写循环sql查询的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 数据字段值是用逗号隔开,如何写SQL语句

Mysql 数据字段值是用逗号隔开,如何写SQL语句

从mysql查询php创建数组

从数组 MySQL 和 PHP 构建插入查询

将数据从 javascript forEach 循环中的 php 数组发送到 ajax 调用的 url

sql 读取数组问题