我的脚本需要一些建议。我正在开发一个唱名系统,我想摆脱我的坏习惯。
这是我想要的照片: http://i.stack.imgur.com/UdqMQ.png
具体来说,每天的每一列上方的按钮。这些按钮中的每一个都做了几乎相同的事情,但对于我的SQL数据库中的不同日期。
所以这是我的代码:
输入:
<th><input type='submit' id='mAllR' name='mAllR' value='All Attended'></th>
<th><input type='submit' id='tAllR' name='tAllR' value='All Attended'></th>
<th><input type='submit' id='wAllR' name='wAllR' value='All Attended'></th>
<th><input type='submit' id='tAllR' name='tAllR' value='All Attended'></th>
<th><input type='submit' id='fAllR' name='fAllR' value='All Attended'></th>
正如您所看到的,它基本上每个按钮都有自己的ID,它将按名称调用函数。
如果我的例子中只有5个输入按钮,那对我来说没问题,但是有7个部门,这意味着35个按钮。我不想做35个与ALMOST完全相同的功能。
我必须使用的代码我可以适应如下:
if(isset($_POST['mAllR']))
{
$index = 0;
foreach($_POST as $key => $value)
{
while($index < $_SESSION['amountT'])
{
$index++;
$sql = ("UPDATE `Employee` SET `Monday`='Attended' WHERE `Job`='Remarketing'");
mysqli_query($con, $sql);
}
}
if($sql)
{
mysqli_close($con);
sleep(4);
echo '<meta http-equiv="refresh" content="0">';
}
}
每个按钮,现在的样子,都需要它自己的版本。 (不要担心会议ETC,这些会在其他地方处理,以避免重叠/重叠。
实际上,代码不是问题,我只想将其优化为更少的代码。欢迎任何建议。
答案 0 :(得分:2)
由于你的所有按钮都做了几乎相同的事情,我猜在每种情况下只是改变查询中的一些值。
我会这样做
首先,我将创建一个包含每个按钮的不同数据的数组(日期和工作,因为这是我可以看到代码需要的唯一区别)
// Monday
$array["mAllR"]["day"] = "Monday";
$array["mAllR"]["job"] = "Marketing";
// Tuesday
$array["tAllR"]["day"] = "Tuesday";
$array["tAllR"]["job"] = "Aonther job";
// Etc...
然后在foreach循环中,我会检查按钮的名称(请参阅数组中的内容) 主键是名称按钮)
foreach($_POST as $key => $value) {
$button = "";
// I check for the value of the button to get the key (button's name)
if($value == 'All attended') {
$button = $key;
// Then I call the 'day' and 'job' values from the array
// where the main key is the button's name
while($index < $_SESSION['amountT'])
{
$index++;
// See that I pass the day and job defined in the array using the button's name
$sql = ("UPDATE `Employee` SET `"+$array[$button]["day"]+"`='Attended' WHERE `Job`='"+$array[$button]["job"]+"'");
mysqli_query($con, $sql);
}
}
}
编辑:将其包装在一个函数中。
// Wrap
function postFunc() {
// The code above
}
// Use
if(isset($_POST)) {
postFunc();
}
这将是我的方法。但它有一个缺点,因为我正在检查按钮的值并在该条件下做所有事情我失去了对你可能想要控制的每个其他字段的控制。我没有在代码中看到你试图控制另一个字段,所以这种方法可能很有用。
答案 1 :(得分:1)
我会为你的按钮使用更好的名称值。例如:day-who-job,所以它就像:mon-all-receting。然后爆炸价值,以获得一天,谁和工作。我还要在名称中添加“sub”,以便稍后我们可以轻松找到它。它只是让我们知道它的提交按钮。由于您没有在表单中显示任何其他项目,因此我传递了一个隐藏字段,以便我们可以判断它是否已提交。
<form action="" method="POST">
<input type="hidden" name="myform" value="1" />
<th><input type='submit' id='mon-all-remarketing' name='sub-Monday-All-Remarketing' value='All Attended'></th>
<th><input type='submit' id='tue-all-remarketing' name='sub-Tuesday-All-Remarketing' value='All Attended'></th>
<th><input type='submit' id='wed-all-remarketing' name='sub-Wednesday-All-Remarketing' value='All Attended'></th>
<th><input type='submit' id='thu-all-remarketing' name='sub-Thursday-All-Remarketing' value='All Attended'></th>
<th><input type='submit' id='fri-all-remarketing' name='sub-Friday-All-Remarketing' value='All Attended'></th>
</form>
现在,提交表单时,点击按钮的名称将通过POST传递。
<?php
function updateAttendance($day, $who, $job) {
$sql = ("UPDATE `Employee` SET `$day`='Attended' WHERE `Job`='$job'");
if ($result = mysqli_query($con, $sql)) {
echo '<meta http-equiv="refresh" content="0">';
}
}
if ( isset($_POST['myform']) && ($_POST['myform'] == 1) ) {
// forms been submitted
foreach ($_POST as $key => $val) {
if( strstr($key, 'sub-') ) {
// if found, it's your button. ex: sub-Tuesday-All-Remarketing
$array = explode('-', $key); // now its split by the dash "-"
$day = $array[1]; // Tuesday
$who = $array[2]; // All
$job = $array[3]; // Remarketing
updateAttendance($day, $who, $job);
}
}
}
可能存在一些缺陷,但我希望你能够实现我的目标。您可能希望确保对查询进行清理,但在SQL查询中使用页面中的数据并不安全。如果您没有使用预准备语句,那么您需要对它们进行清理,或者通过switch case语句对它们进行清理,并使用switch case中的结果。
这会做两件事,使用缩短的日期缩短您的提交按钮,并且可以安全地在SQL查询中使用:
<?php
function returnDay($day) {
switch($day) {
case "mon":
return "Monday";
break;
case "tue":
return "Tuesday";
break;
// etc etc
}
return false;
}
您可以在“updateAttendance()”函数中使用该函数,以确保它是安全数据。您必须使用较短的名称命名按钮:sub-mon-all-receting。
您还可以复制此开关案例功能以处理“再营销”或任何其他值。