我知道我的问题有点奇怪,但我需要这个我正在编写的函数。 我一直在努力解决这个问题。
假设我有以下数组:
$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()函数,我无法检查是否自动关键。
由于
答案 0 :(得分:2)
PHP自动将“0”转换为整数,所以AFAIK,无法检查是否自动分配了密钥。
为什么不使用null
或false
值?
$array = array(
"column1" => null,
"column2" => null,
"column3"=>"value3" ,
"1"=>"value5" ,
"0"=>"value6"
);
null
的唯一问题是如何确定用户在查询中何时需要IS NULL
。在这种情况下,您可以使用false
严格检查if ($value === false)
。
在我看来,您还应该考虑在查询生成中使用预准备语句,以避免注入的可能性。
<强>更新强>
如果开发人员要使用它,他们可能不应该使用数组。你应该有一个类和一个加载它的方法。例如:
public function addField($name, $value=false) {
$this->fields[$name] = $value;
}
答案 1 :(得分:2)
您的示例数组正在覆盖前2个元素。我跑了这个:
$array = array(
"column1" ,
"column2" ,
"column3"=>"value3" ,
"1"=>"value5" ,
"0"=>"value6"
);
print_r($array);
得到了这个输出:
Array
(
[0] => value6
[1] => value5
[column3] => value3
)
答案 2 :(得分:0)
你需要知道在PHP中,没有“无密钥”数组。我们可以在代码中编写数组而不需要键,只需要值,但解释器会在读取/解析时自动分配数字索引。
这个
array ( 'one', 'two', 'three' )
...与此完全相同:
array ( 0 => 'one', 1 => 'two', 2 => 'three' )
结论:无论你是否编写,数组键始终存在于PHP中。如果您没有在您的代码中放置密钥*(这是100%合法的)密钥仍然存在(必须存在)并且将被视为数字。
答案 3 :(得分:0)
如果您选择保留此结构,则可能需要创建一个类来处理此问题。在PHP 5中,类可以扩展ArrayIterator
,从而导致独特的用例,例如您所描述的用例。
示例:
<?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等),然后将限定符放在数组中。
就目前而言,如果您尝试将数字键和值放在一起,您的数组将会执行时髦的事情。所以我不重复别人发布的内容,我建议你回顾一下为什么不可持续的重要解释。
答案 4 :(得分:0)
您必须遵守自己代码的约定和风格。您已将表($ array)设置为以下键/值对。您还使用了=&gt;运营商和报价&#34; &#34; 。但是,由于代码编写中的行为不一致,您正在失去它。为什么数组元素在中途突然写入不同?
$array = array(
"column1" ,
"column2" ,
"column3"=>"value3" ,
"7"=>"value5" ,
"8"=>"value6"
);
缺少必要的运算符和分隔符以及正确读取和解析代码所需的操作符和分隔符应写为:
$array = array(
"column1" => "" ,
"column2" => "" ,
"column3" => "value3" ,
"7" => "value5" ,
"8" => "value6"
);
这样可以保持您设置的约定,并允许您在不知道密钥的情况下进行迭代。
也不要在数组中使用NULL。空字符串和NULL不是一回事:
$array = array(
"column1" => null,
"column2" => null,
"column3"=>"value3" ,
"1"=>"value5" ,
"0"=>"value6"
);
因为元素
会让你痛苦$array["column1"] = null;
$array["column2"] = null;
对于使用isset()和empty(),将返回false,并且仅对is_null进行resspond,这对于跟随您的任何开发人员来说都是一个痛苦的对象。
使用以下编码风格说明使用它会减少再次犯同样错误的可能性,并且更容易理解你出错的地方。
$array["column1"] = ""; // without quotes $array["column1"] = ; will error
$array["column2"] = ""; // swapping $array[] = "column2"; breaks key/value pair
$array["column3"] = "value3";
$array["7"] = "value5";
$array["8"] = "value6";