使用一个 'isset' 语句处理不同的 PHP 提交
Handle different PHP submits with one 'isset' statement
我正在尝试使用 PHP 从 MySQL 数据库加载数据并在 HTML 中提交图像。单击特定图像后,与图像关联的一些文本将通过 MySQL/PHP 加载到页面上。我想在不使用许多 isset 语句的情况下完成此操作。
HTML:
<input type="image" name="image1" src="img/image1.jpg"></input>
<input type="image" name="image2" src="img/image2.jpg"></input>
<input type="image" name="image3" src="img/image3.jpg"></input>
<input type="image" name="image4" src="img/image4.jpg"></input>
<input type="image" name="image5" src="img/image5.jpg"></input>
(我还有几个输入,如上所示,但为了简洁起见,已将其减少为五个输入)
PHP:
if(isset($_POST["image1"])){
//load mysql data associated with image 1
}
if(isset($_POST["image2"])){
//load mysql data associated with image 2
}
if(isset($_POST["image3"])){
//load mysql data associated with image 3
}
if(isset($_POST["image4"])){
//load mysql data associated with image 4
}
if(isset($_POST["image5"])){
//load mysql data associated with image 5
}
我有大约 30 张这样的图片,所以我自然希望避免对每张图片都执行 "if(isset)" 声明,就像我在上面演示的那样。无论如何使用一个 isset 语句来处理这些唯一输入名称中的每一个?也许使用循环?谢谢
您正在寻找这样的东西吗?
从 1 循环到 31 并检查 post 是否动态设置...
for($number = 1; $number < 31; ++$number) {
$image = "image" . $number;
if(isset($_POST[$image])){
//load mysql data associated with $image
}
}
请注意,如果您更改视图中的图像名称,它将不起作用。您必须遵守数字顺序。
你可以有一个字符串数组,其中每个字符串都是一个有效输入字段的名称,然后你可以对 $_POST
进行循环并查看是否每个字符串都设置在那里:
$validInputs = array('image1','image2','image3','image4','image5');
foreach( $_POST as $k=>$v ){
if( in_array($k,$validInputs) ){
// Do something
}
}
这种类型的设置假定图像处理除了名称之外是相同的。这种使用输入白名单的方法在某些情况下也非常方便。提供了对 in_array
的参考。
这是第二个答案,完全不同的方法,因为它是在对手头的问题有更高的理解之后。首先,图像通过GET输入return x,y貌似不管怎样。如果您想在 POST 的某些计算中使用 x,y,这是有问题的。然而,我们可以做的是使用 JavaScript 获取 x,y 并使用该信息设置一个 AJAX 调用。
虽然我的另一个答案已被接受,但我认为这是更正确的答案。
HTML
<input type="image" name="image1" src="img/1.png"></input>
<input type="image" name="image2" src="img/2.png"></input>
<input type="image" name="image3" src="img/3.png"></input>
<input type="image" name="image4" src="img/4.png"></input>
<input type="image" name="image5" src="img/5.png"></input>
JavaScript
为了简单起见,我使用 jQuery。您可以在没有 jQuery.
的情况下执行此操作
$('input[type="image"]').on('click',function(e){
// Do not go to next page
e.preventDefault();
// Prepare necessary structure
var offset = $(this).offset();
var postData = {
'name': $(this).attr('name'),
'x': e.pageX - offset.left,
'y': e.pageY - offset.top
};
// AJAX Call
$.ajax({
url: 'ajax.php',
method: 'POST',
data: postData,
dataType: 'html',
success: function(data){
// Do something
}
});
});
PHP
$whiteList = array('image1','image2','image3','image4','image5');
if( in_array($_POST['name'],$whiteList) ){
// Process
}
如果我点击(267,60),$_POST
的结构如下所示:
Array
(
[name] => image1
[x] => 267
[y] => 60
)
一行(未测试)
$images = array_filter(array_map(range(1,31), function($i){return isset($_POST['image' . $i]) ? $_POST['image' . $i] : false;}));
我正在尝试使用 PHP 从 MySQL 数据库加载数据并在 HTML 中提交图像。单击特定图像后,与图像关联的一些文本将通过 MySQL/PHP 加载到页面上。我想在不使用许多 isset 语句的情况下完成此操作。
HTML:
<input type="image" name="image1" src="img/image1.jpg"></input>
<input type="image" name="image2" src="img/image2.jpg"></input>
<input type="image" name="image3" src="img/image3.jpg"></input>
<input type="image" name="image4" src="img/image4.jpg"></input>
<input type="image" name="image5" src="img/image5.jpg"></input>
(我还有几个输入,如上所示,但为了简洁起见,已将其减少为五个输入)
PHP:
if(isset($_POST["image1"])){
//load mysql data associated with image 1
}
if(isset($_POST["image2"])){
//load mysql data associated with image 2
}
if(isset($_POST["image3"])){
//load mysql data associated with image 3
}
if(isset($_POST["image4"])){
//load mysql data associated with image 4
}
if(isset($_POST["image5"])){
//load mysql data associated with image 5
}
我有大约 30 张这样的图片,所以我自然希望避免对每张图片都执行 "if(isset)" 声明,就像我在上面演示的那样。无论如何使用一个 isset 语句来处理这些唯一输入名称中的每一个?也许使用循环?谢谢
您正在寻找这样的东西吗?
从 1 循环到 31 并检查 post 是否动态设置...
for($number = 1; $number < 31; ++$number) {
$image = "image" . $number;
if(isset($_POST[$image])){
//load mysql data associated with $image
}
}
请注意,如果您更改视图中的图像名称,它将不起作用。您必须遵守数字顺序。
你可以有一个字符串数组,其中每个字符串都是一个有效输入字段的名称,然后你可以对 $_POST
进行循环并查看是否每个字符串都设置在那里:
$validInputs = array('image1','image2','image3','image4','image5');
foreach( $_POST as $k=>$v ){
if( in_array($k,$validInputs) ){
// Do something
}
}
这种类型的设置假定图像处理除了名称之外是相同的。这种使用输入白名单的方法在某些情况下也非常方便。提供了对 in_array
的参考。
这是第二个答案,完全不同的方法,因为它是在对手头的问题有更高的理解之后。首先,图像通过GET输入return x,y貌似不管怎样。如果您想在 POST 的某些计算中使用 x,y,这是有问题的。然而,我们可以做的是使用 JavaScript 获取 x,y 并使用该信息设置一个 AJAX 调用。
虽然我的另一个答案已被接受,但我认为这是更正确的答案。
HTML
<input type="image" name="image1" src="img/1.png"></input>
<input type="image" name="image2" src="img/2.png"></input>
<input type="image" name="image3" src="img/3.png"></input>
<input type="image" name="image4" src="img/4.png"></input>
<input type="image" name="image5" src="img/5.png"></input>
JavaScript
为了简单起见,我使用 jQuery。您可以在没有 jQuery.
的情况下执行此操作$('input[type="image"]').on('click',function(e){
// Do not go to next page
e.preventDefault();
// Prepare necessary structure
var offset = $(this).offset();
var postData = {
'name': $(this).attr('name'),
'x': e.pageX - offset.left,
'y': e.pageY - offset.top
};
// AJAX Call
$.ajax({
url: 'ajax.php',
method: 'POST',
data: postData,
dataType: 'html',
success: function(data){
// Do something
}
});
});
PHP
$whiteList = array('image1','image2','image3','image4','image5');
if( in_array($_POST['name'],$whiteList) ){
// Process
}
如果我点击(267,60),$_POST
的结构如下所示:
Array
(
[name] => image1
[x] => 267
[y] => 60
)
一行(未测试)
$images = array_filter(array_map(range(1,31), function($i){return isset($_POST['image' . $i]) ? $_POST['image' . $i] : false;}));