SHOW COLUMNS,动态变量,INSERT INTO ..内爆?

时间:2013-07-31 07:34:09

标签: php mysql forms html-table http-post

此表单从表pracownicy获取列名。它是动态的,因为这些是新员工在开始为我们公司工作时将在他的计算机上使用的应用程序的名称。
我在表pracownicy中添加了另一个表格,因为员工正在使用的应用程序数量正在增加。
这个表格适用于每个部门的主管,以宣布我们有新员工上班。我有一个问题,将数据插回mysql 如何发布并从此表单中输入insert into数据?每次我向数据库添加一些新应用程序时,变量的数量(来自“SHOW COLUMNS”的应用程序)都会发生变化,所以我不能使用静态变量。
显示列,$query = Values (Implode) ???

echo '<form action="formularz.php" method="POST">
<table  border=0 class=\"odd gradeX\">
<tr bgcolor=#ffdddd>
<td>Imię i nazwisko:</td>
<td><input type="text" name="imieinazwisko"></td>
</tr>
<tr bgcolor=#ddddff>
<td>Dział:</td>
<td align=center><select name="dzial">
    <option value = "LCL">LCL
    <option value = "NVOCC">NVOCC
    <option value = "ZA">ZA
    <option value = "ZAM">ZAM
    <option value = "ZLR">ZLR
    <option value = "ZR">ZR
    <option value = "ZT">ZT
</select></td>
</tr>
<tr bgcolor=#ffdddd>
<td>Telefon:</td>
<td align=center><select name="telefon">
    <option value = "Stacjonarny">Stacjonarny
    <option value = "Blackberry">Blackbery
    <option value = "Blackberry + Stacjonarny">Blackbery + Stacjonarny
</select></td>
</tr>
<tr bgcolor=#ddddff>
<td>Komputer:</td>
<td align=center><select name="komputer">
    <option value = "Laptop">Laptop
    <option value = "Laptop + Iplus">Laptop + Iplus
    <option value = "Stacjonarny">Stacjonarny
</select></td>
</tr>
<tr bgcolor=#ffdddd>
<td> <link rel="stylesheet" 
href="http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" />
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js"></script>
<link rel="stylesheet" href="/resources/demos/style.css" />
<script>
$(function() {
$( "#datepicker" ).datepicker();
});
</script>
</head>
<body>
<p>Data rozpoczęcia pracy: </td><td><input type="text" 
name ="data" id="datepicker"/></p></td>
</tr>
<tr bgcolor=#ddddff>
<td>Oprogramowanie:</td><td></td></tr>


<tr bgcolor=#ddddff>';



$result = mysql_query("SHOW COLUMNS FROM pracownicy") or    die(mysql_error());

        while ($row = mysql_fetch_array($result))
        {
if($row[0] == 'id' || $row[0] == 'imieinazwisko' || $row[0] == 'dzial' 
|| $row[0] == 'telefon' || $row[0] == 'komputer' || $row[0] == oprogramowanie' 
||          $row[0] == 'data')
continue;
        echo '<td bgcolor=#ddddff>'.$row[0].'<br />';


if (stripos($row[0], "uprawnienia") !== false) {
echo '<td bgcolor=#ddddff><p><a class=podpowiedz href=#>   
<input type="text" name="'.$row[0].'">
<span>Uprawnienia typu "stanowisko" lub "jak ktoś"</span></a></p>          
</td></tr>';
        }
        else
        { 
echo '<td bgcolor=#ddddff align=center><select name="'.$row[0].'">
<option value = "Nie">Nie
<option value = "Tak">Tak
</td>
</tr>';
}

}
//echo '</select></form>';
echo '

<tr>
<td><input type="submit" name="zapisz" value="Zapisz"></td>
</tr>
</form>
</table>
</form></center>';`

if(isset($_POST['zapisz'])) 
{
$imieinazwisko = trim($_POST['imieinazwisko']);
$dzial = trim($_POST['dzial']);
$telefon = trim($_POST['telefon']);
$komputer = trim($_POST['komputer']);
$data = trim($_POST['data']);
???  $rowSrray = trim($_POST[$row[0]]);           ---????

??? $query = "INSERT INTO `pracownicy` VALUES (NULL , '$imieinazwisko' , '$dzial',
'$telefon' , '$komputer' , '$data', ".implode(', ', $_POST[$row['0']]).")"; ---???

1 个答案:

答案 0 :(得分:1)

您应该认真考虑更改数据库结构。在正在运行的数据库应用程序中向表中动态添加列不是一个好主意。

您的请求不是一个不寻常的请求,但在大多数情况下,人们通过指定实际应用程序的一列来解决问题,然后再将一些列放入有关所选应用程序的信息中(以char,整数odr的形式)日期字段)。这样做的好处是可以保持桌面结构小巧且易于管理,但同时又非常灵活。具有太多(通常未使用)列的表被视为丑陋凌乱,因为它们会不必要地降低SQL服务器的速度。

所以,也许以下内容可能会对您有所帮助:

CREATE TABLE applications (apid int auto_increment PRIMARY KEY, apname varchar(64), apdescription nvarchar(1024))

-- "pracownicy" --> users?
CREATE TABLE users (usid int auto_increment PRIMARY KEY, usname varchar(64), usfirstname varchar(64), ustel varchar(64) null, uscomputer varchar(64) null)

-- and then the linking element: app2usr
CREATE TABLE app2usr (auaid int, auuid int, auinfo varchar(64) null, auactive int DEFAULT 1, PRIMARY KEY(auaid,auuid))

现在,您可以根据需要为每个用户提供尽可能多(或少数)的应用程序,而无需更改表格布局。弹出新应用程序时,唯一需要更新的是应用程序表,每个应用程序包含一行。

获取一个用户的所有应用程序信息的典型查询可能是

SELECT usname,usfirstname,apname,auinfo 
  FROM users INNER JOIN app2usr ON auuid=usid
             INNER JOIN applications ON apid=auaid 
  WHER auactive>0

在更新或插入新信息时,您将相应地在app2usr中创建(或删除)记录。我知道这只是一个非常粗略的描述,让你走上“正确的道路”......

修改

要从表单 收集所有应用输入字段,您需要先了解哪些应用分配给用户。也许您为此目的使用了复选框或多个选择元素?

  • 在第一种情况下,您可以扫描$ _POST数组以获取有效的应用程序名称(针对您应首先从服务器获取的列表,类似SELECT apid,apname FROM applications)。
  • 在第二种情况下,select元素会将一个ID数组放入$ _POST数组中,该数组对应于所选的应用程序 - IF 你已经在第一个方面设置了选择框地点。像<select name="apps" multiple="multiple"><option value="1">Application1</option>...</select>这样的东西,你可以从应用程序表中获取值和Application1名称。