alestro
@alestro

Почему pdo::execute() не подменяет псевдопеременные?

private function attributes($atributes, $isObject=false){
		if($isObject){$attributes=get_object_vars($atributes);}
	  	foreach($atributes as $key=>$value) {
	    	if(!empty($value)){
	      	$keys[]=$key;
			$values[]=$value;
			$props[':'.$key]=$value;
	    	}
	  	}
	  	return [$keys,$values,$props];
	}
	
	public function create($arrayOrObject,$tableName,$isObject=false){
		$attributes = self::attributes($arrayOrObject,$isObject);
		if(empty($attributes)){return false;}
	     list($keys,$values,$props)=$attributes;
	  	$sql = "INSERT INTO ".$tableName." ( ";
		$sql .= implode(", ", $keys);
	  	$sql .= " ) VALUES (' ";
		$sql .= implode("','", array_keys($props));
		$sql .= " ')";
		$sth=$this->prepare($sql);
		$sth->execute( $props);
	}

При выполнении запроса в таблицу добавляются записи, но вместо значений вставляются псевдопеременные, как показано на скриншоте ниже, в чем проблема?
cee6f595f5694510bdf36b08cecf2838.png
  • Вопрос задан
  • 153 просмотра
Решения вопроса 1
mahoho
@mahoho
Full stack certified PHP developer.
Если вы передаете параметры в качестве аргумента для execute() вместо того, чтобы биндить их по одному, то двоеточие для имен плейсхолдеров не нужно. То есть, вот здесь надо надо убрать двоеточия:
$props[':'.$key]=$value; -> $props[$key]=$value;
а тут не нужны кавычки, execute() все сам приведет к строкам, а двоеточия надо добавить:
$sql .= implode("','", array_keys($props)); ->  $sql .= ":" .  implode(", :", array_keys($props));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы