簡體   English   中英

SQL UPDATE選擇帶有多個PHP數組

[英]SQL UPDATE select w/ multiple to a PHP array

我知道這段代碼中的SQL注入問題。 但是,我只專注於嘗試獲取更新MySQL服務器的表單。 我有兩個選擇框。 我可以在兩者之間來回傳送設備。 但是,當我去更新它不​​起作用。 請幫我!

此處為表格:

$connection = mysql_connect('#', '#', '#'); 
mysql_select_db('#');

$techequipment = "SELECT serial, type_id FROM tbl_assets WHERE user_id = {$_GET ['TechID']} AND date_installed IS NULL AND date_returned IS NULL AND metro_date_returned IS NULL ORDER BY type_id, serial";
$techresult = mysql_query($techequipment);

$jobequipment = "SELECT serial, type_id FROM tbl_assets WHERE account_number = {$_GET ['JobNum']} ORDER BY type_id, serial";
$jobresult = mysql_query($jobequipment);

$link = array($_GET ['JobNum'])
?>
<title>Assign Equipment</title>
<table align="center">
<form action="assigned_equipment.php?<? echo http_build_query($link)?>" method="POST">
<tr>    
<td><center><b><?php echo "Tech #"; echo $_GET ['TechID']; echo " Assigned Equipment"; ?></b></center></td> 
<td></td>   
<td><center><b><?php echo "Job #"; echo $_GET ['JobNum']; echo " Assigned Equipment"; ?></b></center></td>  
</tr>

<tr>
<td>
<select  name="tech[]" size=20 multiple   id="list1"  STYLE="width: 350px">
<?php $i=0; while($row = mysql_fetch_array($techresult)) { ?>
<option value="<?=$row["serial"];?>"> <?=$row["type_id"]." - ".$row["serial"];?></option>
<?php $i++; } ?> </select>  
</td>

<td>
<center><input type="button" id="btnAdd" value="Transfer >>"/></center>
<center><input type="button" id="btnRemove" value="<< Transfer"/></center>
</td>

<td>
<select  name="job[]" size=20 multiple   id="list2"  STYLE="width: 350px">
<?php $i=0; while($row = mysql_fetch_array($jobresult)) { ?>
<option value="<?=$row["serial"];?>"> <?=$row["type_id"]." - ".$row["serial"];?></option>
<?php $i++; } ?> </select>  
</td>
</tr>

<tr>
<td colspan="2">
</td>

<td>
<center><input type="submit" value="SUBMIT"/></center>
</form>
</td>   

</tr>   
<tr>
<td colspan="3">
<center>Multi Select: Press & hold [CTRL] while clicking on the items.</center>
</td>
</tr>

<tr>
<td colspan="3">
<center><a href="jobs.php">EXIT</a></center>
</td>
</tr>

</table>



<script src="js/jquery-2.2.0.js" type="text/javascript"></script>

<script type="text/javascript">
    $(document).ready(
        function () {

//TAKE EQUIPMENT FROM TECH AND PUT IT IN JOB BOX            
            $('#btnAdd').click(
                function (e) {
                    $('#list1 > option:selected').appendTo('#list2');
                    e.preventDefault();
                });


//TAKE EQUIPMENT FROM JOB AND PUT IT IN TECH BOX
                $('#btnRemove').click(
                function (e) {
                    $('#list2 > option:selected').appendTo('#list1');
                    e.preventDefault();
                });
        });
</script>

這是我的assigned_equipment.php文件:

<?php

$connection = mysql_connect('#', '#', '#')
    or die('Could not connect: ' .mysql_error());
mysql_select_db('#');

$equipmentquery="UPDATE tbl_assets SET date_installed = curdate(), account_number = {$_GET['0']} WHERE serial = $_POST['job']";

$techquery="UPDATE tbl_assets SET date_installed = curdate(), account_number = {$_GET ['0']} WHERE serial = $_POST['tech']";

?>

好的,您是對的,似乎“ 0”是通過$ _GET或$ _POST提交的有效變量名。 因此,這不是問題。

但是您的問題是$_POST['job']是一個數組。

您嘗試這樣做:

$equipmentquery = ""
. "UPDATE tbl_assets "
. "SET date_installed = curdate(), "
. "account_number = {$_GET['0']} "
. "WHERE serial = $_POST['job']";

雖然$_POST['job']是一個數組,但您不能這樣做!

請嘗試以下操作:

$jobnum = (int)$_GET['0'];
$job_arr = $_POST['job'];

if(($jobnum > 0) && is_array($job_arr) && (count($job_arr) > 0)) {

    $equipmentquery = ""
        . "UPDATE tbl_assets "
        . "SET date_installed = curdate(), "
        . "account_number = ".$jobnum." "
        . "WHERE "
        . 'serial IN ("'.implode('","',$job_arr).'") ';
}

好的,這會發生什么?

我懷疑您的序列號包含作業數組中發布的值。 因此,您想更新序列號與數組中發布值匹配的每一行。

如果您的$ _POST: Array ( [job] => Array ( [0] => gi4416ncd876 [1] => GI4521NA3391 [2] => M40719GD6274 [3] => PAEH01734539 ) )以及您的$ _GET: Array ( [0] => 113852 ) ,將導致以下查詢:

UPDATE tbl_assets 
SET date_installed = curdate(),
account_number = 113852 
WHERE serial IN ("gi4416ncd876","GI4521NA3391",
"M40719GD6274","PAEH01734539")

好的,現在您有了一個有效的查詢。 不是時候執行它了!!!

因此,您需要:

$result = mysql_query ( $equipmentquery );

這是重要的一行,您不見了!

最后,您的代碼可能如下所示:

<?php

$connection = mysql_connect('#', '#', '#')
    or die('Could not connect: ' .mysql_error());
mysql_select_db('#');

$jobnum = (int)$_GET['0'];
$job_arr = $_POST['job'];
$tech_arr = $_POST['tech'];

if(($jobnum > 0) && is_array($job_arr) && (count($job_arr) > 0)) {

    $equipmentquery = ""
        . "UPDATE tbl_assets "
        . "SET date_installed = curdate(), "
        . "account_number = ".$jobnum." "
        . "WHERE "
        . 'serial IN ("'.implode('","',$job_arr).'") ';

    $result1 = mysql_query ( $equipmentquery );

}
if(($jobnum > 0) && is_array($tech_arr) && (count($tech_arr) > 0)) {

    $techquery = ""
        . "UPDATE tbl_assets "
        . "SET date_installed = curdate(), "
        . "account_number = ".$jobnum." "
        . "WHERE "
        . 'serial IN ("'.implode('","',$job_arr).'") ';

    $result2 = mysql_query ( $techquery );

}

當這種方法有效時,您應該直接切換到mysqli或pdo! mysql_函數已被棄用,並且在最新的php版本中不再存在! 您應該真正關心sql注入! 因此,請使用准備好的語句來清理您的輸入數據!!! 有各種各樣的教程在那里! 請勿在現場環境中使用此代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM