确保PHP变量的最佳方法是数组
我有一个javascript客户端将参数传递给服务器函数(我使用的是ExtJS Direct)。有时客户端发送单个对象,有时发送一组对象 目前,我正在使用此EnsureArray函数来确保参数是数组,然后我执行确保PHP变量的最佳方法是数组,php,arrays,php-5.3,Php,Arrays,Php 5.3,我有一个javascript客户端将参数传递给服务器函数(我使用的是ExtJS Direct)。有时客户端发送单个对象,有时发送一组对象 目前,我正在使用此EnsureArray函数来确保参数是数组,然后我执行foreach: // Wraps a non array variable with an array. function EnsureArray( &$aVar ) { if ( !is_array( $aVar ) ) $var = array( $a
foreach
:
// Wraps a non array variable with an array.
function EnsureArray( &$aVar )
{
if ( !is_array( $aVar ) )
$var = array( $aVar );
}
function Destroy( $aRecords )
{
// $aRecords might be a single object or an array of objects. Ensure it's wrapped as an array.
$this->EnsureArray( $aRecords );
foreach ( $aRecords as $aRecord )
{
sql( "UPDATE Groups SET deleted = true WHERE id = $aRecord->id LIMIT 1" );
}
return array(
'success' => true,
);
}
有没有一个技巧,更简洁的方式,一行可以做到同样的
编辑:自从发布这个问题以来,我发现ExtJS必须发送以数组形式包装的所有记录。这可能是tbh的最佳方式,如果您不打算强制执行始终发送数组。这可能是tbh的最佳方式,如果您不打算强制执行始终发送一个数组。您可以尝试以下操作,而不是函数:
$aRecords = is_array($aRecords) ? $aRecords : array($aRecords);
您可以尝试以下操作,而不是函数:
$aRecords = is_array($aRecords) ? $aRecords : array($aRecords);
我将使函数
Destroy
需要数组作为其参数:
function Destroy(array $aRecords) { ... }
然后,客户端还应始终发送阵列。如果出于任何原因,这是不可能的,则从客户端接收(非)数组并将其传递给Destroy()
的代码需要负责将其作为数组传递,因为它是(非兼容)客户端和标准化函数之间的接口
对于客户端可以调用的每个可能的操作,可能都有一个端点,因此您甚至不需要确定数据是否是数组,您只需知道。即:
// someaction.php
include 'destroy.php';
$data = json_decode($_POST['data']);
Destroy($data);
但是:
如果客户端不稳定地向同一操作发送不同的格式,请修复客户端。我将使函数
Destroy
需要数组作为其参数:
function Destroy(array $aRecords) { ... }
然后,客户端还应始终发送阵列。如果出于任何原因,这是不可能的,则从客户端接收(非)数组并将其传递给Destroy()
的代码需要负责将其作为数组传递,因为它是(非兼容)客户端和标准化函数之间的接口
对于客户端可以调用的每个可能的操作,可能都有一个端点,因此您甚至不需要确定数据是否是数组,您只需知道。即:
// someaction.php
include 'destroy.php';
$data = json_decode($_POST['data']);
Destroy($data);
但是:
如果客户端不规则地向同一操作发送不同的格式,请修复客户端。只需将变量键入数组:
function Destroy( $aRecords )
{
foreach ( (array)$aRecords as $aRecord )
{
sql( "UPDATE Groups SET deleted = true WHERE id = $aRecord->id LIMIT 1" );
}
return array(
'success' => true,
);
}
请参见简单地将变量类型转换为数组:
function Destroy( $aRecords )
{
foreach ( (array)$aRecords as $aRecord )
{
sql( "UPDATE Groups SET deleted = true WHERE id = $aRecord->id LIMIT 1" );
}
return array(
'success' => true,
);
}
请参见最好的方法是标准化客户端应该发送的内容…:)我完全同意这一点,并考虑修复SQL注入。对于一所学校来说,这是一个封闭的系统,所以不是一个主要的问题。@Izhaki是一项体育运动,不管怎样,它都可以净化输入。过于自信并不能确保你的应用程序安全!最好的方法是标准化客户端应该发送的内容…:)我完全同意这一点,并考虑修复SQL注入。对于一所学校来说,这是一个封闭的系统,所以不是一个主要的问题。@Izhaki是一项体育运动,不管怎样,它都可以净化输入。过于自信并不能确保你的应用程序安全!谢谢你的回复。这是非常有益的。由于我使用的是ExtJS Direct包,并且所有服务器调用都是在一个相当复杂的MVC框架内自动完成的,所以我不希望修补ExtJS,尤其是Direct包。Sencha的人有时有很好的理由来解释他们是如何实施的。我会提供开发人员考虑使呼叫一致。我会接受最适合原问题的答案。不过,非常感谢。谢谢你的回复。这是非常有益的。由于我使用的是ExtJS Direct包,并且所有服务器调用都是在一个相当复杂的MVC框架内自动完成的,所以我不希望修补ExtJS,尤其是Direct包。Sencha的人有时有很好的理由来解释他们是如何实施的。我会提供开发人员考虑使呼叫一致。我会接受最适合原问题的答案。不过,非常感谢。如果它是一个数组的话,那就不起作用了!如果它应该是一个数组的话,那就行不通了!当处理数组或基元类型的变量时,这是一种优雅的方法,但对于对象来说,它将失败得可怕。根据“如果将对象转换为数组,则结果是一个数组,其元素是对象的属性。”此外,
(array)null
是空数组,它可能是您想要的,也可能不是您想要的。当您处理数组或基元类型的变量时,这是一种优雅的方法,但对于对象来说,它将失败得可怕。根据“如果将对象转换为数组,则结果是其元素为对象属性的数组。”此外,(array)null
是空数组,它可能是您想要的,也可能不是您想要的。