2013-11-04 70 views
3

我目前试图建立使用的MySQL/PHP的一种形式,下面是我的代码的一部分,到目前为止如何获取字段类型和值?

块#1:

$proceso = mysqli_fetch_assoc($result); // my query returns only one row 

... 

<form action='actualizar.php' method='Post'> 
<?php 
foreach(array_keys($proceso) as $key){ 

echo "<label for='$key'>$key: </label>"; 
echo "<input name='$key' value='".$proceso[$key]."'><br/>"; 

} 
echo "<input type='hidden' name='View' value='$view'>"; 
?> 

<input type="submit" value="Actualizar"> 
</form> 

这至今是让我一个形式在那里我使用字段名称来生成标签和输入框,我显示字段值。我想进一步格式化一些使用jquery datepicker的字段,但仅限于那些在mysql表中具有type = Date的字段。

我一直在使用类似的尝试mysqli_fetch_field_direct

块#2:

$fields = mysqli_num_fields($result); 
for ($i=0; $i < $fields; $i++) { 
    $field_types[] = $result->fetch_field_direct($i)->type; 
} 

但在这种情况下,我不能得到的价值,只是类型

有没有一种简单的方法来获得字段的类型和价值?

编辑,以(尝试)来简化:

比方说,我有一个名为email场其类型= varchar和我的SQL查询产生一个结果[email protected]

从块#1,我得到:

 ------------------------------- 
    Field-Name | Field-Value 
    email  | [email protected] 

从块#2,我得到:

 ------------------------------- 
    Field-Name | Field-Type 
    email  | varchar 

什么,我想是让

 ------------------------------- 
    Field-Name | Field-Type | Field-Value 
    email  | varchar | [email protected] 

这是因为我想用字段类型为CSS类添加到输入框(如使用日期选择器)。

+0

我很困惑...是' $ proceso [$ key]'不是值? –

+0

是的,在第一个代码块中,我得到的是值,但不是类型,而在第二个代码块中,我得到的是类型,但不是值。我有一个很难的第一个块用'mysqli_fetch_field_direct'混合我不知道我怎么会为了有类似同时获得: '回声“<输入名称=‘$键’类=‘$类型’值= '“。proceso [$ key]。”'
“;'在一个更简单的过程中。 – AlvaroFG

+0

我在下面发布了一些内容......我不确定它是否正是你想要的。让我知道,如果你需要我,我可以修改它。 –

回答

6

编辑:我把输出的表,因为我无法入睡......

好了...看,如果这是你想要的...

这是一个表

mysql> describe user; 
+-------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-------------+------------------+------+-----+---------+----------------+ 
| User_ID  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| Email  | varchar(100)  | YES |  | NULL |    | 
| Name  | varchar(100)  | YES |  | NULL |    | 
| Password | varchar(100)  | YES |  | NULL |    | 
| FB_ID  | int(11)   | YES |  | NULL |    | 
| Total_Score | int(11)   | YES |  | 0  |    | 
| add_date | datetime   | YES |  | NULL |    | 
+-------------+------------------+------+-----+---------+----------------+ 
7 rows in set (0.00 sec) 

,并从DB:我对不同的SO问题作出

mysql> select * from user limit 1; 
+---------+-------+------+----------+-------+-------------+---------------------+ 
| User_ID | Email | Name | Password | FB_ID | Total_Score | add_date   | 
+---------+-------+------+----------+-------+-------------+---------------------+ 
|  1 | NULL | kim | NULL  | NULL |   10 | 2013-11-03 23:04:08 | 
+---------+-------+------+----------+-------+-------------+---------------------+ 
+ 
1 row in set (0.00 sec) 

和代码:

<?php 
$mysqli = mysqli_connect("localhost", "root", "", "test"); 

// this came from http://php.net/manual/en/mysqli-result.fetch-field-direct.php 
$mysql_data_type_hash = array(
    1=>'tinyint', 
    2=>'smallint', 
    3=>'int', 
    4=>'float', 
    5=>'double', 
    7=>'timestamp', 
    8=>'bigint', 
    9=>'mediumint', 
    10=>'date', 
    11=>'time', 
    12=>'datetime', 
    13=>'year', 
    16=>'bit', 
    //252 is currently mapped to all text and blob types (MySQL 5.0.51a) 
    253=>'varchar', 
    254=>'char', 
    246=>'decimal' 
); 

// run the query... 
$result = $mysqli->query("select * from user limit 1"); 

// get one row of data from the query results 
$proceso = mysqli_fetch_assoc($result); 

print "<table> 
     <tr> 
      <th>\$key</th> 
      <th>\$value</th> 
      <th>\$datatype</th> 
      <th>\$dt_str</th> 
     </tr> "; 

// to count columns for fetch_field_direct() 
$count = 0; 

// foreach column in that row... 
foreach ($proceso as $key => $value) 
{ 
    $datatype = $result->fetch_field_direct($count)->type; 
    $dt_str = $mysql_data_type_hash[$datatype]; 
    $value = (empty($value)) ? 'null' : $value; 

    print "<tr> 
      <td>$key</td> 
      <td>$value</td> 
      <td class='right'>$datatype</td> 
      <td>$dt_str</td> 
     </tr> "; 
    $count++; 
} 

print "</table>"; 

mysqli_close($mysqli); 
?> 

<style> 
    /* this is css that you don't need but i was bored so i made it pretty...! */ 
    table { font-family:Courier New; 
      border-color:#E5E8E3; border-style:solid; border-weight:1px; border-collapse:collapse;} 
    td,th { padding-left:5px; padding-right:5px; margin-right:20px; 
      border-color:#E5E8E3; border-style:solid; border-weight:1px; } 
    .right { text-align:right } 
</style> 

所以......澄清...

您可以使用在foreach这些变量来输出或然而利用这些信息你想要的:(我用我的输出的第一行,为USER_ID,作为一个例子)

  • $key是列/字段名称(如user_id

  • $field_types[$key]来自$result->fetch_field_direct($i)->type(如3

  • $mysql_data_type_hash[$datatype]是在代码顶部使用$mysql_data_type_hash数组的数据类型的字符串版本。这并不是必须的,但是我将它包含在内,所以这个例子更加清晰。 (如int

  • $proceso[$key] = $value =是你本次迭代的foreach语句(如1)的值

输出:

$key   $value   $datatype  $dt_str 
User_ID  1      3  int 
Email   null     253  varchar 
Name   kim     253  varchar 
Password  null     253  varchar 
FB_ID   null     3  int 
Total_Score 10      3  int 
add_date  2013-11-03 23:04:08 12  datetime 
+0

谢谢,但我想是让somethign这样的输出 '电子邮件:VARCHAR测试@ example.com' '名称:VARCHAR Tess' 这是考虑到我的查询生成一行。 – AlvaroFG

+0

只是将一行更改为'print $ proceso [$ key]。“:$ str
”;'那将是'data:datatype' ...?我以为你可以弄清楚你想自己格式化输出的方式,因为我不知道...... –

+0

哦,这是有道理的,我明天让你知道。谢谢你的时间。 – AlvaroFG