2013-03-18 2 views
0

Я пытаюсь вставить несколько значений в MySQL через массив, но он не работает или не сообщает об ошибке, поэтому я не уверен, где я ошибаюсь. Любая помощь будет оценена по достоинству.PHP mysqli insert command

Вот где я вызываю функцию

$testArrayList = array(); 
      $testArrayList[] = 'Account_idAccount'; 
      $testArrayList[] = 'firstName'; 
      $testArrayList[] = 'lastName'; 
      $testArrayValues = array(); 
      $testArrayValues[] = $idAccount; 
      $testArrayValues[] = $firstName; 
      $testArrayValues[] = $lastName; 
      $dbManager->insertValues("User", $testArrayList, $testArrayValues); 

Теперь, вот это insertValues ​​Funciton называют.

 public function insertValues($table, $cols, $values) { 
    foreach ($cols as $col) 
     $colString .= $col.','; 
    foreach ($values as $value) 
    { 
     $valueAmount .= '?,'; 
     $valueType .= 's'; 
     $valueParam .= $value.","; 
    } 
    $colString = substr($colString, 0, -1); 
    $valueAmount = substr($valueAmount, 0, -1); 
    $valueParam = substr($valueParam, 0, -1); 

    $mysqli = new mysqli(DBHOST, DBUSER, DBPASSWORD, DBDATABASE); 
    $sql = "INSERT INTO $table ($colString) VALUES($valueAmount)"; 
    /* Prepared statement, stage 1: prepare */ 
    if (!($stmt = $mysqli->prepare($sql))) { 
     echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error; 
    } 
    print_r($valueParam); 
    /* Prepared statement, stage 2: bind and execute */ 
    if (!$stmt->bind_param("$valueType", $valueParam)) { 
     echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error; 
    } 

    if (!$stmt->execute()) { 
     echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; 
    } 
    /* explicit close recommended */ 
    $stmt->close(); 
    $mysqli->close(); 
} 
+1

Так что ошибки вы получаете? –

+0

У меня вообще нет ошибок. Я просто знаю, что это не работает, потому что я не вижу своих значений в базе данных. Я заметил, что раньше, когда я играл с кавычками вокруг функции -> bindParam, я получал бы ошибки, и теперь у меня есть это, я не получаю ошибок, но у меня также нет никаких значений в базы данных. – AlexHeuman

+1

Проводили ли вы какую-либо отладку? –

ответ

1

Существовали кучу ошибок там, вот переписать версию вы действуете, что должно работать:

public function insertValues($table, array $cols, array $values) { 

    $mysqli = new mysqli(DBHOST, DBUSER, DBPASSWORD, DBDATABASE); 

    $colString = implode(', ', $cols); // x, x, x 
    $valString = implode(', ', array_fill(0, count($values), '?')); // ?, ?, ? 

    $sql = "INSERT INTO $table ($colString) VALUES($valString)"; 
    if (!$stmt = $mysqli->prepare($sql)) 
     echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error; 

    foreach ($values as $v) 
     if (!$stmt->bind_param('s', $v)) 
      echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error; 

    if (!$stmt->execute()) 
     echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; 

    $stmt->close(); 
    $mysqli->close(); 

} 

Вы должны так же инициализировать Mysqli соединение один раз в конструкторе вместо каждого метода :

public function __construct() { 
    $this->mysqli = new mysqli(DBHOST, DBUSER, DBPASSWORD, DBDATABASE); 
} 

public function __destruct() { 
    $this->mysqli->close(); 
} 

Кроме того, это хорошо, что вы создаете правильную функцию для обработки этих ошибок, таких как:

public function showError($message, object $obj) { 
    echo "$message: (" . $obj->errno . ") " . $obj->error; 
} 

ведущий к этому чистому версии вы действуете:

public function insertValues($table, $cols, $values) { 

    ... 

    if (!$stmt = $mysqli->prepare($sql)) 
     $this->showError("Prepare failed", $mysqli); 

    foreach ($values as $v) 
     if (!$stmt->bind_param('s', $v)) 
      $this->showError("Binding parameters failed", $stmt); 

    if (!$stmt->execute()) 
     $this->showError("Execute failed", $stmt); 

    ... 

} 
+0

Большое спасибо за переписывание моей функции. К сожалению, он все еще не работает. Я обманываю свои мозги на этом. – AlexHeuman

+0

@AlexHeuman, боюсь, это не проблема их функций. – Shoe

+0

Я рад, что знаю это сейчас, и спасибо за подробный ответ. Также кажется, что массив $ values ​​печатается на экране, но я нигде не печатаю его. В любом случае, спасибо за вашу помощь. – AlexHeuman

0

Я переписал функцию, так что вы можете четко зе почему вы используете bind_param() неправильно.

Эта версия является всего лишь примером, который работает только с двумя колонами!

function insertValues($table, array $cols, array $values) { 

     $mysqli = new mysqli('localhost', 'petr', null,'test'); 

     $colString = implode(', ', $cols); // x, x, x 
     $valString = implode(', ', array_fill(0, count($values), '?')); // ?, ?, ? 

     $sql = "INSERT INTO $table ($colString) VALUES($valString)"; 
     if (!$stmt = $mysqli->prepare($sql)) 
      echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error; 

     list($a,$b) = $values; 
     // params $a and $b must exists during $stmt execution, therefore you can't use foreach with temproray variable 
     if (!$stmt->bind_param('ss', $a, $b)) 
       echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error; 

     if (!$stmt->execute()) 
      echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; 

     $stmt->close(); 
     $mysqli->close(); 

    } 

Это работает:

insertValues('test',array('firstName','lastName'),array('Jan Amos','Komensky')); 
+0

Спасибо, я думал, что могу использовать строка в bind_param, но я ошибся. Спасибо за вашу помощь. – AlexHeuman

+1

Не говорите спасибо и клик о «полезной» стрелке :) – Petr