PHP-检查数组元素是否默认有键,或者它';他的钥匙是自动的
我知道我的问题有点奇怪,但我需要这个函数来编写。 我已经为此挣扎了一段时间 假设我有以下数组:PHP-检查数组元素是否默认有键,或者它';他的钥匙是自动的,php,mysql,arrays,function,Php,Mysql,Arrays,Function,我知道我的问题有点奇怪,但我需要这个函数来编写。 我已经为此挣扎了一段时间 假设我有以下数组: $array = array( "column1" , "column2" , "column3"=>"value3" , "7"=>"value5" , "8"=>"value6" ); $array包含默认设置的带键元素和不带键元素。 我知道没有键的元素将设置数字自动键 我正在尝试编写一个函数,将此数组转换为以下MYSQL se
$array = array(
"column1" ,
"column2" ,
"column3"=>"value3" ,
"7"=>"value5" ,
"8"=>"value6"
);
$array包含默认设置的带键元素和不带键元素。
我知道没有键的元素将设置数字自动键
我正在尝试编写一个函数,将此数组转换为以下MYSQL select语句:
SELECT `column1` , `column2` , `column3` , `1` , `0` FROM table WHERE column3 = 'value3' AND 1 = 'value5' AND 0 = 'value6';
Mysql表名可以是数字。
在我的函数中,我必须检查数组元素是否有一个由php设置的键或由用户发送的键
到目前为止,我的职能形式如下:
//Function that converts WHERE simple statement to Array
function arrayToQuery($array){
if(is_array($array)){
$selectedColumns = array();
$whereColumns = array();
foreach($array as $key=>$value){
//This is where I'm stuck, I can't write the is_automated() function
if(!is_automated($key)){
$whereColumns[$key] = $value;
}
$selectedColumns[] = $key;
}
$sql = "SELECT " . join(",", $selectedColumns) . " WHERE ";
foreach($whereColumns as $column=>$value){
$sql .= $column . " = " . $value . " AND ";
}
$sql .= " 1=1 ";
return $sql;
}
return false;
}
我被is_automated()函数卡住了,我无法检查任何一个键是否是自动的
谢谢,PHP会自动将“0”转换为整数,因此,恕我直言,无法检查是否自动分配了密钥 为什么不使用
null
或false
值
$array = array(
"column1" => null,
"column2" => null,
"column3"=>"value3" ,
"1"=>"value5" ,
"0"=>"value6"
);
null
的唯一问题是如何确定用户希望在查询中何时为null
。在这种情况下,您可以使用false
并严格检查if($value==false)
在我看来,您还应该考虑在查询生成中使用预先准备好的语句,以避免注入的可能性
更新:
如果开发人员要使用这个,他们可能不应该使用数组。您应该有一个类和一个方法来加载它。例如:
public function addField($name, $value=false) {
$this->fields[$name] = $value;
}
PHP会自动将“0”转换为整数,所以很抱歉,无法检查是否自动分配了密钥 为什么不使用
null
或false
值
$array = array(
"column1" => null,
"column2" => null,
"column3"=>"value3" ,
"1"=>"value5" ,
"0"=>"value6"
);
null
的唯一问题是如何确定用户希望在查询中何时为null
。在这种情况下,您可以使用false
并严格检查if($value==false)
在我看来,您还应该考虑在查询生成中使用预先准备好的语句,以避免注入的可能性
更新:
如果开发人员要使用这个,他们可能不应该使用数组。您应该有一个类和一个方法来加载它。例如:
public function addField($name, $value=false) {
$this->fields[$name] = $value;
}
您的示例数组正在覆盖前2个元素。我运行了以下命令:
$array = array(
"column1" ,
"column2" ,
"column3"=>"value3" ,
"1"=>"value5" ,
"0"=>"value6"
);
print_r($array);
得到了这个输出:
Array
(
[0] => value6
[1] => value5
[column3] => value3
)
您的示例数组正在覆盖前2个元素。我运行了以下命令:
$array = array(
"column1" ,
"column2" ,
"column3"=>"value3" ,
"1"=>"value5" ,
"0"=>"value6"
);
print_r($array);
得到了这个输出:
Array
(
[0] => value6
[1] => value5
[column3] => value3
)
您需要知道,在PHP中,没有“无键”数组。我们可以在代码中编写数组,不需要键,只需要值,但解释器在读取/解析时会自动分配数字索引 这个
数组('1','2','3')
。。。与此完全相同:
array(0=>one',1=>two',2=>three')
结论:数组键在PHP中始终存在,无论您是否编写了它。如果您没有在代码中放入键*(这是100%合法的),那么键仍然存在(必须存在),并且将被视为数字键。您需要知道,在PHP中,没有“无键”数组。我们可以在代码中编写数组,不需要键,只需要值,但解释器在读取/解析时会自动分配数字索引 这个
数组('1','2','3')
。。。与此完全相同:
array(0=>one',1=>two',2=>three')
结论:数组键在PHP中始终存在,无论您是否编写了它。如果您不在代码*(100%合法)中放入键,则键仍然存在(必须存在),并且将被视为数字键。如果您选择保留此结构,您可能需要创建一个类来处理此问题。在PHP5中,类可以扩展,从而产生独特的用例,如您正在描述的用例 例如:
<?php
class MySQLArray extends ArrayIterator {
public $container,$noKeySet,$current, $flags;
public function __construct() {
$this->setFlags(1);
}
public function offsetSet($offset,$value) {
if(!isset($offset)) {
$this->noKeySet[] = $value;
}
return parent::offsetSet($offset,$value);
}
public function isAutomated($key) {
if(isset($this->noKeySet[$key])) {
return true;
}
return false;
}
}
$array = new MySQLArray();
$array[] = "column1";
$array[] = "column2";
$array["column3"] = "value3";
$array[7] = "value5" ;
$array[8] ="value6";
function arrayToQuery($array){
$selectedColumns = array();
$whereColumns = array();
foreach($array as $key=>$value){ gettype($value);
//This is where I'm stuck, I can't write the is_automated() function
if(!$array->isAutomated($key)){
$whereColumns[$key] = $value;
}
$selectedColumns[] = $key;
}
$sql = "SELECT " . join(",", $selectedColumns) . " WHERE ";
foreach($whereColumns as $column=>$value){
$sql .= $column . " = " . $value . " AND ";
}
$sql .= " 1=1 ";
return $sql;
return false;
}
?>
不幸的是,您将无法使用许多快速数组实现程序或任何速记,因为您正在和一个对象交互
然而
更好的最终解决方案是依赖于数组以外的其他东西。根据您的用例(未指定),可以有多种方法来实现这一点,而不是使用单一数组
首先,为什么要将数字作为SQL列?这不是很好的解释,对我来说似乎不可扩展。如果您有理由将数字作为列,根据您的开发阶段,一个相对简单的修复方法是在每个数字前面放置一个限定符(例如,stage_1、stage_2等),然后将限定符放入数组中
就目前而言,如果您尝试将数字键和值放在一起,那么您的数组将做一些古怪的事情。因此,我不会重复其他人发布的内容,我将建议您查看关于为什么这是不可持续的伟大解释。如果您选择保留此结构,您可能会希望创建一个类来处理此问题。在PHP5中,类可以扩展,从而产生独特的用例,如您正在描述的用例 例如:
<?php
class MySQLArray extends ArrayIterator {
public $container,$noKeySet,$current, $flags;
public function __construct() {
$this->setFlags(1);
}
public function offsetSet($offset,$value) {
if(!isset($offset)) {
$this->noKeySet[] = $value;
}
return parent::offsetSet($offset,$value);
}
public function isAutomated($key) {
if(isset($this->noKeySet[$key])) {
return true;
}
return false;
}
}
$array = new MySQLArray();
$array[] = "column1";
$array[] = "column2";
$array["column3"] = "value3";
$array[7] = "value5" ;
$array[8] ="value6";
function arrayToQuery($array){
$selectedColumns = array();
$whereColumns = array();
foreach($array as $key=>$value){ gettype($value);
//This is where I'm stuck, I can't write the is_automated() function
if(!$array->isAutomated($key)){
$whereColumns[$key] = $value;
}
$selectedColumns[] = $key;
}
$sql = "SELECT " . join(",", $selectedColumns) . " WHERE ";
foreach($whereColumns as $column=>$value){
$sql .= $column . " = " . $value . " AND ";
}
$sql .= " 1=1 ";
return $sql;
return false;
}
?>
不幸的是,您将无法使用许多快速数组实现程序或任何速记,因为您正在和一个对象交互
然而
更好的最终解决方案是依赖于数组以外的其他东西。根据您的用例(未指定),可以有多种方法来实现这一点,而不是使用单一数组
首先,为什么要将数字作为SQL列?这不是很好的解释,对我来说似乎不可扩展。如果您有理由将数字作为列,根据您的开发阶段,一个相对简单的修复方法是在每个数字前面放置一个限定符(例如,stage_1、stage_2等),然后将限定符放入数组中
就目前而言,如果您尝试使用数字ke,您的数组将做一些古怪的事情