多字段表单到sql方法发布请求



我的html页面包含5个字段。他们不一定都知情。方法post将字段的内容发送到php页面。查询只能从数据库中提取所填写字段所涉及的行。html页面发送请求,但数据库不返回任何内容。我不知道问题是在html方面还是在php页面上。我挡在面前的是复杂性的整体。

主html页面:

<tr>
<td style="font-family: 'Conv_Muli-Italic'; font-size: 16px; text-align: center; font-weight: bold; color: #808080;">
<form action = "ocr6.php" method = "POST">
<p>&nbsp;</p>
<table width="100%">
<tbody>
<tr>
<th scope="col">TYPE THE WORD OF YOUR CHOICE IN TEXT FIELDS. </th>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<table width="100%" align="center">
<tbody>
<tr>
<th scope="col"><p>NAME</p>
<p>
<input name="nom" type="text"  />
</p></th>
<th scope="col"><p>STATE</p>
<p>
<input name="nom2" type="text" />
</p></th>
<th scope="col"><p>CATEGORY</p>
<p>
<input name="nom3" type="text" />
</p></th>
<th scope="col"><p>DETAIL</p>
<p>
<input name="nom4" type="text" />
</p></th>
<th scope="col"><p>ORIGINE</p>
<p>
<input name="nom5" type="text" />
</p></th>
</tr>

ocr6.php:

<?php
$mysqli = new mysqli("localhost", "....", "mot de passe", "mabase");

if ($mysqli->connect_errno) {
die('<p>Connexion impossible : '.$mysqli->connect_error.'</p>');
}
$nom = $_POST['nom'];
$nom2 = $_POST['nom2'];         
$nom3 = $_POST['nom3'];
$nom4 = $_POST['nom4'];                 
$nom5 = $_POST['nom5'];

$stmt = $mysqli->prepare("SELECT FROM fiveC2 WHERE name LIKE ? OR state LIKE ? OR category LIKE ? OR detail LIKE ? OR origine LIKE ? LIMIT 0, 3000");
$stmt->bind_param("sssss", '%$nom%', '%$nom2%', '%$nom3%', '%$nom4%', '%$nom5%');
$stmt->execute();
$result = $stmt->get_result();

if (!$result) {
die('<p>ERREUR Requête invalide : '.$mysqli->error.'</p>');
}

while ($row = $result->fetch_assoc()) {
$recherche = $row['recherche'] ;
echo '<p>'.$recherche.'</p>'."rn" ;
}

$result->free() ;

$mysqli->close() ;
?>  </p>
</blockquote>
</ul>
<p><strong> - END OF REQUEST - </strong></p>
</div>
</div>
</div>
</div>
</body>
</html>

谢谢你的帮助。

您可以用变量替换一些代码,这样可以使代码更加灵活。

$stmt = $mysqli->prepare("SELECT FROM fiveC2 WHERE $where_string LIMIT 0, 3000");
^^^
string containing "name LIKE ?" etc 
$stmt->bind_param($type_string, ...$value_array );
^^^              ^^^
string containing "sss"         |__ array containing values with 
variable-length argument list (the ...)

要创建这些变量,必须循环$_POST并跳过所有空值。

使用input_names => column names组合(请参阅下面的注释(和您将在语句中使用的变量创建一个数组。

$names = [
'nom'  => 'name',
'nom1' => 'state',
'nom2' => 'category',
'nom3' => 'detail',
'nom4' => 'origine'
];
$where_array  = [];  //note this is an array!
$type_string  = '';  
$value_array  = [];

然后循环$_POST以设置变量

foreach($names as $input_name => $column_name){
// if empty: skip
if( $_POST[ $input_name ] === '' ) continue;
//add to $where_array: "name LIKE ?"
$where_array[] =  $column_name.' LIKE ?';  
//add to $type_string:  "s"
$type_string.= 's';
//add to $value_array: "%abcdef%"
$query_value[] = '%'.$_POST[ $input_name ].'%';
}
// Test if there was anything at all in $_POST
if($type_string == ''){
... oops, there was no input 
}
// Convert the $where_array to $where_string using " OR " in between
$where_string = implode(' OR ', $where_array); 

现在你有了你需要的一切。显然,foreach()是在创建查询和执行语句之前执行的。

例如

$_POST : [ nom  => '',              
nom2 => 'abcdef',        
nom3 => '12',            
nom4 => '',
nom5 => 'Bharata'
]
$where_string : 'state LIKE ? OR category LIKE ? OR origine LIKE ?'
$type_string  : 'sss'
$value_array  : ['%abcdef%', '%12%', '%Bharata%']

注意将表单名称中的输入元素与数据库中的列名相对应会容易得多。然后,您可以直接使用$_POST中的密钥名称及其值。如果您将来在表单中添加另一个搜索元素,它也可以防止出现问题。

foreach($_POST as $column_name => $value){
if( $value === '' ) continue;
...
$query_value[] = "%$value%";
}

有用的阅读:可变长度参数列表

相关内容

  • 没有找到相关文章

最新更新