2015-05-20 2 views
0

Позвольте мне предисловие, что я только начал изучать подготовленные заявления, поэтому многое из этого можно было бы просто понять, но я хочу попробовать.динамический подготовленный оператор вставки

Я пытаюсь создать динамическую функцию создания в моем классе DatabaseObject. Функция будет принимать любое количество значений потенциально любого числа различных допустимых типов данных. К сожалению, я ничего не пробовал. Вот код.

public function create() { 
    $db = Database::getInstance(); 
    $mysqli = $db->getConnection(); 
    //array of escaped values of all types in the object 
    $attributes = $this->sanitized_attributes(); 

    $check = $mysqli->stmt_init(); 

    $paramType = array(); 

    $types = ''; $bindParam = array(); $where = ''; $count = 0; 

    foreach($attributes as $key=>$val) 
    { 
     $types .= 'i'; 
     $bindParam[] = '$p'.$count.'=$param["'.$key.'"]'; 
     $where .= "$key = ? AND "; 
     $count++; 
    } 

    $sql_query = "INSERT INTO `".static::$table_name."` "; 

    $sql_query .= "VALUES ("; 

    foreach ($attributes as $key => $value) { 
     $valueType = gettype($value); 

     if ($valueType == 'string') { 
      $sql_query .= "?,"; 
      array_push($paramType, "s"); 
     } else if ($valueType == 'integer') { 
      $sql_query .= "?,"; 
      array_push($paramType, "i"); 
     } else if ($valueType == 'double') { 
      $sql_query .= "?,"; 
      array_push($paramType, "d"); 
     } else { 
      $sql_query .= "?,"; 
      array_push($paramType, "b"); 
     }   
    } 

    $sql_query .= ")"; 
} 

На данный момент я полностью потерял то, что я должен делать.

У меня есть простые подготовленные операторы для работы, но этот процесс намного сложнее и динамичен, и я не знаю, правильно ли я обработал процесс до этого момента и что делать после sql_query, чтобы получить это работать. Все вопросы здесь оставили меня в замешательстве, поэтому, возможно, если бы я получил руководство с моим текущим кодом, чтобы увидеть, где я ошибся, это поможет.

Я ценю ваше время.

ответ

0
public function create() { 
    $db = Database::getInstance(); 
    $mysqli = $db->getConnection(); 

    $attributes = $this->sanitized_attributes(); 

    $tableName = static::$table_name; 

    $columnNames = array(); 
    $placeHolders = array(); 
    $values = array(); 

    foreach($attributes as $key=>$val) 
    { 
     // skip identity field 
     if ($key == static::$identity) 
      continue; 
     $columnNames[] = '`' . $key. '`'; 
     $placeHolders[] = '?'; 
     $values[] = $val; 
    } 

    $sql = "Insert into `{$tableName}` (" . join(',', $columnNames) . ") VALUES (" . join(',', $placeHolders) . ")"; 

    $statement = $mysqli->stmt_init(); 
    if (!$statement->prepare($sql)) { 
     die("Error message: " . $mysqli->error); 
     return; 
    } 

    $bindString = array(); 
    $bindValues = array(); 

    // build bind mapping (ssdib) as an array 
    foreach($values as $value) { 
     $valueType = gettype($value); 

     if ($valueType == 'string') { 
      $bindString[] = 's'; 
     } else if ($valueType == 'integer') { 
      $bindString[] = 'i'; 
     } else if ($valueType == 'double') { 
      $bindString[] = 'd'; 
     } else { 
      $bindString[] = 'b'; 
     } 

     $bindValues[] = $value; 
    } 

    // prepend the bind mapping (ssdib) to the beginning of the array 
    array_unshift($bindValues, join('', $bindString)); 

    // convert the array to an array of references 
    $bindReferences = array(); 
    foreach($bindValues as $k => $v) { 
     $bindReferences[$k] = &$bindValues[$k]; 
    } 

    // call the bind_param function passing the array of referenced values 
    call_user_func_array(array($statement, "bind_param"), $bindReferences); 

    $statement->execute(); 
    $statement->close(); 

    return true; 
} 

Я хочу особо отметить, что сам не нашел решение. Я долгое время разработчик нашел это решение и хотел опубликовать его для тех, кто может захотеть узнать.