2016-01-29 93 views
0

作爲PHP和MySQL的新手,我已經閱讀了很多閱讀這裏的內容。 This post是關於我能找到的與我的問題相關的最接近的問題。我從解決方案中借用了一些,但它只能讓我感到滿意。插入數組檢查複選框

我使用SELECT語句的表格數據填充表格,當前有15行。結果中的每一行都有一個複選框和相應的數據。表格中還有一個textarea。

我需要將textarea中的文本輸入以及與該複選框關聯的Case_NoClient_No插入到不同的表格中......只有在複選框被選中的情況下。每行只有文本相同。 INSERT中沒有任何未勾選的複選框應該包含在內。

我意識到答案可能是某種循環,但我沒有太多的經驗,從循環插入,只顯示來自循環的數據。

這裏是我的形式:

<form method="post" name="group_note" action="group_test.php?Counselor=<?php echo $_GET['Counselor'];?>"/> 
<table border="1" width="650" cellpadding="5" cellspacing="0" bordercolor="#999999"> 
<tr><th>Group Note</th></tr> 
<tr><td><textarea name="Note" rows="10" cols="115"></textarea></td></tr> 
<tr><th align="left">Select clients below to receive this group note &nbsp; <input type="submit" value="Add Group Note"></th></tr> 
</table> 
<table border="1" cellpadding="5" cellspacing="0" bordercolor="#999999"> 
<thead> 
    <tr> 
    <th bgcolor="#009999">Select</th> 
    <th bgcolor="#009999">Name</th> 
    <th bgcolor="#009999">Case No.</th> 
    <th bgcolor="#009999">Client No.</th> 
    </tr> 
    </thead> 
    <tbody> 
<?php foreach ($dbh -> query($sql) as $row) { ?>   
<tr> 
     <td><input type="checkbox" name="groupselect[]" value="<?php echo $row['Case_No'];?>" /></td> 
     <td><?php echo $row['FirstName']. " " . $row['LastName']; ?></td> 
     <td><?php echo $row['Case_No']; ?></td> 
     <td><?php echo $row['Client_No']; ?><input type="hidden" name="Client_No" value="<?php echo $row['Client_No']; ?>"/></td> 

<?php } ?> 
</tbody> 
</table> 
    <input type="hidden" name="MM_insert" value="group_note"> 
</form> 

而INSERT語句:

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "group_note")) { 
try 
    { 
     $dbh = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_database; charset=utf8", $mysql_username, $mysql_password); 
     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     $insertGroup = array(); 
     foreach ($_POST['groupselect'] as $i => $value) { 
     $GroupNote_CaseNo=$_POST['groupselect'][$i]; 
     $GroupNote_ClientID=$_POST['Client_No'][$i]; 
     $GroupNote=$_POST['Note']; 
     $insertGroup[]="(".$GroupNote_CaseNo.", ".$GroupNote_ClientID.", ".$GroupNote.")"; 
     $Note = "INSERT INTO group_note GroupNote_CaseNo, GroupNote_ClientID, GroupNote VALUES ". implode(", ", $insertGroup). "GroupNote_CaseNo=VALUES(GroupNote_CaseNo), GroupNote_ClientID= VALUES(GroupNote_ClientID), GroupNote=VALUES(GroupNote)"; 
     $stmt->execute(); 
     $stmt->closeCursor();  
    } 
    } 
    catch (Exception $e) 
    { 
    $message = 'Something not working right!!'; 
    } 
} 

當我選擇兩個或三個複選框,並插入一些文本,在提交我從var_dump($_POST['groupselect'])

這一結果
array(3) { [0]=> string(22) "(1518-R, 4, This note)" [1]=> string(22) 
"(1534-R, 3, This note)" [2]=> string(22) "(4062-R, 3, This note)" } 

ClientNo只顯示一個數字,他們是三位數字。如果我刪除[$ i]以下$GroupNote_ClientID=$_POST['Client_No'],我會得到所有三位數,但只能從選擇的第一個複選框行:

array(3) { [0]=> string(22) "(1518-R, 4, This note)" [1]=> string(22) 
"(1534-R, 3, This note)" [2]=> string(22) "(4062-R, 3, This note)" } 

在任何情況下,沒有什麼是越來越插入表中。根據變量的語法,PHP錯誤日誌顯示「Undefined variable:insertGroup」和/或「Undefined variable:insertGroup」。

另外,我知道$_POST變量的危險。我的數據庫僅供內部使用。沒有外部訪問。

+1

如果您對MySQL的[INSERT](http://dev.mysql.com/doc/refman/5.7/en/insert.html)語法感興趣,並且實際上打擾您檢查您的查詢調用是否成功,你會一直關於你的sql語法錯誤。但是,相反,你選擇了「沒有任何事會出錯」編程學校,現在你正在爲此而苦惱。從來沒有** EVER **在處理外部資源時承擔成功。總是假設失敗,檢查失敗,並將成功視爲令人驚喜的事情。 –

回答

0

所以,我終於搞定了。首先,來自@CBroe的關於在表單中添加[]ClientNo的建議提取了我需要的第二個變量。另一部分涉及使用PREPARE語句的佔位符更改INSERT聲明。我可以信貸@Marc B嗎?

我也綁定了值,但我認爲接受$_POST輸入是不安全的。我唯一的防範是這不是一個面向公衆的數據庫。

下面是結果(形式並沒有改變,它仍然在原來的問題),比原來的:

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "group_note")) { 
try 
{ 
$dbh = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_database; charset=utf8", $mysql_username, $mysql_password); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$insertGroup = array(); 
foreach ($_POST['groupselect'] as $i => $value) { 
$GroupNote_CaseNo=isset($_POST['groupselect']) ? ($_POST['groupselect'][$i]) : null; 
$GroupNote_ClientID=isset($_POST['ClientNo']) ? ($_POST['ClientNo'][$i]) : null; 
$GroupNote=$_POST['Note']; 
$insertGroup[]="(".$GroupNote_CaseNo.",".$GroupNote_ClientID.",".$GroupNote.")"; 
$Note = 'INSERT INTO group_note (GroupNote_CaseNo,GroupNote_ClientID,GroupNote) VALUES (:GroupNote_CaseNo, :GroupNote_ClientID, :GroupNote)'; 
$stmt=$dbh->prepare($Note); 
$stmt->bindValue(':GroupNote_CaseNo', ($_POST['groupselect'][$i])); 
$stmt->bindValue(':GroupNote_ClientID', ($_POST['ClientNo'][$i])); 
$stmt->bindValue(':GroupNote', $_POST['Note']); 
$stmt->execute(); 
$stmt->closeCursor(); 
} 
} 
catch (Exception $e) 
{ 
$message = $e; 
} 
} 

一些綁定括號中可能是不必要的,但我不是開發人員。它爲我工作,希望它可以幫助別人。

0

ClientNo只顯示一個數字,它們是三位數字。如果我刪除[$ i]以下$ GroupNote_ClientID = $ _ POST [「Client_No」],我會得到所有三位數,但只能從選擇的第一個複選框行

你的隱藏輸入字段使用name="Client_No"它們保存了值 - 您錯過了用於複選框的[],因此您只能獲取最後一個值,而不是數組,而只是一個字符串。通過數字索引訪問字符串將返回其單個字符。

現在將[]添加到隱藏輸入字段的名稱中,您不會在這裏完成。對於type=checkbox,在檢查輸入時僅發送一個值;但所有的隱藏字段將被髮送。由於生成的數組的索引自動生成,因此您將在複選框值和隱藏的輸入值之間產生差異。爲了避免這種情況,您可以通過命名輸入字段如name="foo[0]"name="foo[1]"等來預先指定索引。如果您對這兩個字段都這樣做,則會在數組中正確地匹配這些值。

但是,您仍然必須考慮複選框數組中的索引可能「缺失」,未設置。所以你應該循環隱藏的輸入值數組 - 這將有所有的索引設置,沒有差距。然後使用當前索引來檢查複選框數組是否具有給定鍵的相應元素(isset)。

您也可以使用您的客戶端號碼開始,而不是數字數組索引。

如果您將複選框命名爲name="foo[igf]「,name="foo[dkh]」等,則不再需要隱藏的輸入字段 - 每個選中的複選框都將自動與其客戶端號碼相關聯。

+0

將[]添加到ClientName輸入肯定有效!我的其他答案讓我感到非常困惑。由於複選框是動態生成的,我不知道如何通過重命名輸入字段來預先指定索引。生成的行數可能在一種情況下爲15,另一種情況下爲8,另一種情況下爲2。儘管我通過檢查_some_框並跳過其他框來測試,但結果數組似乎跟上了正確的值。 我理解你的意圖,就數字數組而言,表中有一個自動遞增的索引,如果這可行的話。 – Laner

+0

也許我應該有資格「......投入肯定有效」。儘管'var_dump $ insertGroup'的輸出顯示了所有需要插入的數據(CaseNo,ClientNo,GroupNote ... [0] => string(24)「(()),所以行仍然沒有被插入到表中。 1518-R,336,This note)「。有些東西在我無法辨別的地方失敗,沒有出現在php_errors日誌中 – Laner

+0

也許你應該檢查實際上可能有什麼異常情況,而不是僅僅用你自己的通用錯誤信息 – CBroe