這個問題在這里已經有了答案: 在資料庫列中存盤分隔串列真的那么糟糕嗎? (10 個回答) PHP 表單上的多個復選框選項 (4 個回答) 3 小時前關閉。
我正在做一個個人專案,我有一個帶有復選框的影像網格,并想在我的資料庫中插入復選框的值,但不知道如何插入。我成功地在我的資料庫中插入了一個值,但是當它達到兩個或更多時,它只顯示第一個。
我的復選框網格:
/* Responsive layout - makes a two column-layout instead of four columns */
@media (max-width: 800px) {
.row {
grid-template-columns: 1fr 1fr;
grid-gap: 1%;
align-items: start;
}
}
.gridlabel {
font-size: 10px;
margin-top: 70px;
color: #FFFFFF;
position: absolute;
font-weight: 900;
}
.gridlabelg {
text-align: center;
margin-left: 12px;
font-size: 10px;
margin-top: 60px;
color: #FFFFFF;
position: absolute;
}
ul {
list-style-type: none;
grid-template-columns: 1fr 1fr 1fr 1fr;
}
li {
display: inline-grid;
}
input[type="checkbox"][id^="cb"] {
display: none;
}
.lblimgs {
border: 1px solid #fff;
padding: 0px;
display: grid;
position: relative;
margin: 2px;
cursor: pointer;
}
.lblimgs:before {
background-color: white;
color: white;
content: " ";
display: block;
border-radius: 30%;
border: 1px solid grey;
position: absolute;
top: -5px;
left: -5px;
width: 25px;
height: 25px;
text-align: center;
line-height: 28px;
transition-duration: 0.4s;
transform: scale(0);
}
.lblimgs img {
height: 100px;
width: 144px;
transition-duration: 0.2s;
transform-origin: 50% 50%;
border-radius: 10px;
}
:checked .lblimgs {
border-color: #ddd;
}
:checked .lblimgs:before {
content: "?";
background-color: rgb(173, 168, 168);
transform: scale(1);
}
:checked .lblimgs img {
transform: scale(0.9);
/* box-shadow: 0 0 5px #333; */
z-index: -1;
}
<div class="images">
<ul>
<li><input type="checkbox" id="cb1" name="hotel" value="casamontanha" />
<label for="cb1" class="lblimgs"><img src="pictures/casamontanha.jpg" /></label>
</li>
<li><input type="checkbox" id="cb2" name="hotel" value="fillitheyo" />
<label for="cb2" class="lblimgs"><img src="pictures/filitheyo.jpg" /></label>
</li>
<li><input type="checkbox" id="cb3" name="hotel" value="hardrock" />
<label for="cb3" class="lblimgs"><img src="pictures/hardrock.jpg" /></label>
</li>
<li><input type="checkbox" id="cb4" name="hotel" value="rioquente" />
<label for="cb4" class="lblimgs"><img src="pictures/rioquente.jpg" /></label>
</li>
<li><input type="checkbox" id="cb5" name="hotel" value="sheraton" />
<label for="cb5" class="lblimgs"><img src="pictures/sheraton.jpg" /></label>
</li>
<li><input type="checkbox" id="cb6" name="hotel" value="apart" />
<label for="cb6" class="lblimgs"><img src="pictures/apart.jpg" /></label>
</li>
<li><input type="checkbox" id="cb7" name="hotel" value="lecanton" />
<label for="cb7" class="lblimgs"><img src="pictures/lecanton.jpg" /></label>
</li>
<li><input type="checkbox" id="cb8" name="hotel" value="pestana" />
<label for="cb8" class="lblimgs"><img src="pictures/pestana.jpg" /></label>
</li>
<li><input type="checkbox" id="cb9" name="hotel" value="catello" />
<label for="cb9" class="lblimgs"><img src="pictures/catello.jpg" /></label>
</li>
<li><input type="checkbox" id="cb10" name="hotel" value="wishnatal" />
<label for="cb10" class="lblimgs"><img src="pictures/wishnatal.jpg" /></label>
</li>
<li><input type="checkbox" id="cb11" name="hotel" value="malta" />
<label for="cb11" class="lblimgs"><img src="pictures/malta.jpg" /></label>
</li>
<li><input type="checkbox" id="cb12" name="hotel" value="lhc" />
<label for="cb12" class="lblimgs"><img src="pictures/lhc.jpg" /></label>
</li>
</ul>
</div>
我試圖做這樣的事情:
$cb1=$_POST['hotel'];
$cbx1="";
foreach($checkbox1 as $cbx1)
{
$cb1 .= $cbx1.",";
}
編程新手,請理解!
uj5u.com熱心網友回復:
是的,但請不要!當您嘗試查詢特定資料時,這遲早會導致大量性能問題。請參閱此了解更多資訊。https://en.wikipedia.org/wiki/Database_normalization。但是,如果您真的想要,您可以將所有內容放入一個陣列中,json_encode(...)并json_decode(...)在閱讀時將其字串化。有時,如果您從不打算查詢它,或者這些值僅用于長時間存盤或日志,這可能是有意義的。
我曾經參與過一個專案,由于一些類似的實作,一些頁面的加載時間飆升至 2 分鐘以上,我們不得不投入數周時間來嘗試通過快取頁面和執行各種變通方法來解決這個問題。教訓:堅持最佳實踐并花時間為您的資料創建列。
// get your data into an array like this
$data = ['cb1' => true, 'cb2' => false]; // ... with the rest of the checkboxes
// transform to json
// this will return a string which you can then save into you database
$str = json_encode($data)
// when you read the data from the database you do the opposite
// then you get back the array with your key-value pairs
$data2 = json_decode($str)
uj5u.com熱心網友回復:
是的,但請不要。遲早你會想要改變一些東西,你的資料要么變得毫無用處,要么變得失控,兩者都無法管理。(我從文森特·門澤爾的回答中借用了這句話。)
您可以將真/假值存盤為整數中的位。您將“cb”數視為 2 的指數,因此“cb1”變為 2 1,“cb3”變為 2 3, 等等。它并不漂亮,您很快就會開始獲得大量數字。您“只有”12 個復選框“很好”,因為根據您的資料庫,普通整數將是 32 位或 64 位,但這需要付出代價。如果洗掉“cb8”怎么辦?你被那一點困住了。如果您添加一個新復選框,則會添加一個新的位,因為您不想將新復選框與任何舊復選框混淆。對于一個小專案來說,這似乎是一個好主意,但是當在一個有多個開發人員的大型專案中嘗試它并且沒有人知道這些位是什么意思時,它就變成了不好的做法。兩年后,即使在您自己的專案中,您也可能不知道這些位是什么意思。
最佳做法是讓每個資料點(在本例中為布林值)都有自己的列。這樣您就可以確切地知道這些列的含義。或者至少你可以更容易地記錄它。如果您洗掉了一個復選框并且不想回頭查看資料,則只需洗掉該列即可。一個新的復選框獲得一個新的列。是的,這仍然在增長,資料變得無用,但不再無法管理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/388133.html
標籤:javascript php html
