2015-04-02 2 views
3
<?php 

    $db = new PDO($dsn,$username,$password); 
    $uname='avi'; 
    $age=19; 
    $stmt = $db->prepare('INSERT INTO table(uname,age) VALUES(:uname,:age)'); 
    $stmt->execute(array(':uname'=>$uname,':age'=>$age)); 

    $stmt = $db->prepare('INSERT INTO table(uname,age) VALUES(?,?)'); 
    $stmt->execute(array($uname,$age)); 

    $stmt = $db->prepare('INSERT INTO table(uname,age) VALUES(:uname,:age)'); 
    $stmt->bindValue(':uname',$uname); //can be $uname or just 'avi' 
    $stmt->binParam(':age',$uname); //cannot be 'avi' or value only 
    $stmt->execute(); 

?> 

Когда мы должны использовать bindParam()? Все предыдущие методы кажутся более легкими и требуют меньше строк кода.Что различия и преимущества между bindParam(), bindValue() и выполнение (массив())

В чем преимущество использования bindParam() по другим методам (bindValue(), execute())?

+0

почему винты, когда вы могли бы просто использовать гвозди? Это просто разные способы добиться того же. –

+0

Да, но много сайтов и некоторые примеры здесь, в SO, используют bindParam, когда я должен использовать bindParam? SOm exmaple в документации php показывает, что он используется с хранимой процедурой, которая возвращает значения – AAB

+0

для разных случаев. в полностью нефункциональном коде bindParam() вроде как делать ': foo & = $ var'. параметр foo будет ссылкой на $ var и просто выровнять любое значение в переменной в момент, когда вы вызываете 'execute()'. Версия '-> exec (array (...))' в это время использует значения переменных. –

ответ

4

bindParam() связывает параметр по ссылке, поэтому он будет оцениваться в $stmt->execute(), что отличается от bindValue(), которое оценивается по вызову самой функции.

Так как пример:

bindParam:

<?php 

    try { 

     $dbh = new PDO("mysql:host=localhost;dbname=test", "root", ""); 
     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     $stmt = $dbh->prepare("SELECT * FROM test WHERE number = ?"); 
     $stmt->bindParam(1, $xy, PDO::PARAM_INT); 
     $xy = 123; //See here variable is defined after it has been bind 
     $stmt->execute(); 

     print_r($stmt->fetchAll()); 

    } catch(PDOException $e) { 
     echo $e->getMessage(); 
    } 

?> 

отлично работает!

bindValue:

<?php 

    try { 

     $dbh = new PDO("mysql:host=localhost;dbname=test", "root", ""); 
     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     $stmt = $dbh->prepare("SELECT * FROM test WHERE number = ?"); 
     $stmt->bindValue(1, $xy, PDO::PARAM_INT); 
     $xy = 123; //See here variable is defined after it has been bind 
     $stmt->execute(); 

     print_r($stmt->fetchAll()); 

    } catch(PDOException $e) { 
     echo $e->getMessage(); 
    } 

?> 

выход:

Примечание: Undefined переменной: ху

Также некоторые другие отличия:

  • bindParam() также имеет длина аргумент, который может (должен) быть использован, если вы вызываете IN & OUT процедуры для хранения вывода обратно в переменную (которая также требует, чтобы добавить PDO::PARAM_INPUT_OUTPUT с помощью оператора OR к типу аргумента)
  • С bindParam() & bindValue() вы можно указать тип значения, которое вы не можете сделать в execute(), там все просто строка (PDO :: PARAM_STR)
+0

привет, можете ли вы объяснить, что он оценивает? Я понимаю, что заполнители заменяются фактическими значениями в инструкции sql. – AAB

+0

@AAB Добавлен пример, надеюсь, он поможет вам понять его больше – Rizier123

+0

ваш второй пример, который вы забыли изменить bindParam для bindValue – developerwjk

1

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

Bind Значение

$x = function_call_to_determine_value(); 
$stmt->bindValue(':x',$x); 
$stmt->execute(); 

Bind Param

$stmt->bindParam(':x',$x); 
$x = function_call_to_determine_value(); 
$stmt->execute(); 
+0

Так использует $ stmt = $ db-> prepare ('INSERT INTO table (uname, age) VALUES (: uname,: age)'); $ stmt-> execute (array (': uname' => $ uname, ': age' => $ age)); вместо bindValue нормально? – AAB

+0

@AAB Связывает параметры с помощью массива в исполнении, связывает их как строку ... с bindParam и bindValue вы можете указать тип данных как что-то еще, если хотите. Так не совсем то же самое. – developerwjk

+0

поэтому execute (array ("age" => $ age)) отличается от bindParam (": age", $ age, PARAM_INT) или вы хотели сказать, что я могу указать возраст как строку в bindParam, если бы я хотел ? – AAB

Смежные вопросы