/** * 根据变量列表,判断某个元素的类型 * 如: * (1)$sql = "select * from user where uid=".$uid ; * 那么uid为数值类型 * (2)$sql = "select * from user where uid='".$uid ."'" ; * 那么uid为字符类型 * @param array $vars */ public function addTypeByVars(&$vars) { $len = count($vars); //调整顺序 if ($len > 2) { $item_1 = $vars[0]; $item_2 = $vars[1]; $vars[0] = $item_2; $vars[1] = $item_1; unset($item_1); unset($item_2); } //设置type for ($i = 0; $i < $len; $i++) { //如果元素有前驱和后继 if ($i - 1 >= 0 && $i + 1 <= $len - 1) { $is_pre_value = $vars[$i - 1] instanceof ValueSymbol; $is_curr_var = !$vars[$i] instanceof ValueSymbol; $is_nex_value = $vars[$i + 1] instanceof ValueSymbol; //如果前驱后继都不是value类型或者当前symbol不是变量,则pass if (!$is_pre_value || !$is_nex_value || !$is_curr_var) { continue; } //判断是否被单引号包裹 $is_start_with = CommonUtils::startWith($vars[$i - 1]->getValue(), "'"); $is_end_with = CommonUtils::endsWith($vars[$i + 1]->getValue(), "'"); if ($is_start_with != -1 && $is_end_with != -1) { $vars[$i]->setType("valueInt"); } } else { //如果没有前驱和后继 ,即为开头和结尾,且为var类型,直接设为int if ($vars[$i] instanceof VariableSymbol) { $vars[$i]->setType("valueInt"); } } } }