2009-05-18 68 views
0

我有一個表單,我試圖用複選框顯示一個表單,然後在數據庫中插入是否檢查這些複選框。然後,每次調用該頁面時,檢查該值並將信息附加到html表單以適當地顯示該複選框是否被選中。php表單問題

我修改了下面的代碼示例以使其縮短,並且我知道我將所選值指定給'value',它不會執行任何操作。

<input type="checkbox" name="notice" value="checked" checked/> 

的方法來顯示一個複選框作爲託運,而不是有效的HTML,工作在每一個瀏覽器,並且是基於例如here。我寧願堅持這種做法。

現在,我沒有看到我的代碼有什麼問題。

第一步應該是從數據庫中檢索值,其中onyl一行將被檢索,因爲article_no是主鍵。如果沒有檢索到任何內容,則將變量簡單地賦值爲「」,這會導致複選框未被選中。

當選中該值時,如果選中該值,則應將其插入數據庫中,並在下次查看頁面時顯示爲已選中狀態。

現在,這個代碼強制失敗。螢火蟲不顯示任何東西在控制檯發送或接收,沒有錯誤記錄與PHP或MySQL,沒有什麼出現在數據庫中,儘管字段和這樣是正確的,沒有mysql錯誤報告...

什麼是問題?

The code: 

<?php 

error_reporting(E_ALL); 
if (isset($_GET["cmd"])) 

    $cmd = $_GET["cmd"]; 

else 
if (isset($_POST["cmd"])) 

    $cmd = $_POST["cmd"]; 


    if (isset($_GET["pk"])) 

    { $pk = $_GET["pk"];} 
    if (isset($_POST["deleted"])) 
    { $deleted = $_POST["deleted"];} 
    if (isset($_POST["notice"])) 
    { $notice = $_POST["notice"];} 

$con = mysqli_connect("localhost","user","pass", "db"); 

if (!$con) { 

    echo "Can't connect to MySQL Server. Errorcode: %s\n". mysqli_connect_error(); 

    exit; 

} 
$con->set_charset("utf8"); 
$getformdata = $con->query("select * from TEST where ARTICLE_NO = '$pk'"); 

$checkDeleted = ""; 
$checkNotice = ""; 


    while ($row = mysqli_fetch_assoc($getformdata)) 

    { 

    $checkDeleted = $row['deleted']; 

    $checkNotice = $row['notice']; 

    } 
if($cmd=="submitinfo"){ 
$statusQuery = "INSERT INTO TEST VALUES (?, ?, ?)"; 

if ($statusInfo = $con->prepare($statusQuery)) { 

    $statusInfo->bind_param("sss", $pk, $deleted, $notice); 

    $statusInfo->execute(); 

    $statusInfo->close(); 
} else { 

print_r($con->error); 

} 
} 

echo "<form name=\"statusForm\" action=\"x.php\" method=\"post\" enctype=\"multipart/form-data\"> 

<h1>Editing information for auction: ".$pk."</h1> 
Löschung Ebay: 
<input type=\"checkbox\" name=\"deleted\" value=\"checked\" ".$checkDeleted." align=\"right\"/> 
<br /> 
Abmahnung: 
<input type=\"checkbox\" name=\"notice\" value=\"checked\" ".$checkNotice." align=\"left\"/> 
<br /> 
<input type=\"hidden\" name=\"cmd\" value=\"submitinfo\" /> 
<input name=\"Submit\" type=\"submit\" value=\"submit\" /> 
</form>"; 

在實際的形式/頁,我已經制定適當的消毒。

一個大問題是沒有任何內容被插入到數據庫中,並且根本沒有任何錯誤被返回!

+0

在PHP中添加輸入消毒 - 客戶端消毒可關閉... – Alnitak 2009-05-18 11:03:19

+1

您的代碼易受sql注入攻擊。在第一個選擇查詢中使用$ pk上的bind_param。它也容易受到xss注入的影響。將其嵌入到html中時,使用`htmlspecialchars()`逃避$ pk。 – troelskn 2009-05-18 14:11:16

回答

1

請務必記住,未經檢查的複選框在發送時不會向表單提供任何值。當刪除的框未選中時,沒有設置$ _POST ['deleted']值。

考慮到這一點,如果複選框被清除,看起來您並未實際設置$刪除的值。使用這樣的成語。

$deleted = isset($_POST["deleted"]) ? 1: 0; 

替代的1和0與任何你想要的值在數據庫表中選中和未選中狀態(在你的情況,「檢查」和「」)

+0

如果複選框沒有被選中,那麼相關的值肯定會保持爲「」,這隻會顯示爲未被選中。我仍然不明白爲什麼沒有任何顯然被髮送,我沒有得到任何錯誤。 – 2009-05-18 11:12:50

-1

我認爲複選框應該這樣做方法:

<input type="checkbox" name="notice1" value="value1" checked="checked"/> 
<input type="checkbox" name="notice2" value="value2" checked="checked"/> 
0

沿着相同的路線保羅·迪克森的答案,我在次做到了這一點:

<input type="hidden" name="notice" value="not checked" /> 
<input type="checkbox" name="notice" value="checked" checked="checked" /> 

如果用戶取消選中複選框,則會發送隱藏的輸入值。這樣,$_POST['notice']總是發送到您的腳本。