Приклад використання bind_result проти get_result


83

Я хотів би побачити приклад того, як дзвонити за допомогою bind_resultvs. get_resultта яка буде мета використання одного над іншим.

Також плюси і мінуси використання кожного.

Яке обмеження використання будь-якого і чи є різниця.

Відповіді:


198

Вирішальним фактором для мене є те, чи викликати я свої стовпці запиту за допомогою *.

Для цього bind_result()було б краще використовувати:

// Use bind_result() with fetch()
$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';

Для цього get_result()було б краще використовувати:

// Use get_result() with fetch_assoc() 
$query2 = 'SELECT * FROM table WHERE id = ?';

Приклад 1 для $query1використанняbind_result()

$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';
$id = 5;

if($stmt = $mysqli->prepare($query)){
   /*
        Binds variables to prepared statement

        i    corresponding variable has type integer
        d    corresponding variable has type double
        s    corresponding variable has type string
        b    corresponding variable is a blob and will be sent in packets
   */
   $stmt->bind_param('i',$id);

   /* execute query */
   $stmt->execute();

   /* Store the result (to get properties) */
   $stmt->store_result();

   /* Get the number of rows */
   $num_of_rows = $stmt->num_rows;

   /* Bind the result to variables */
   $stmt->bind_result($id, $first_name, $last_name, $username);

   while ($stmt->fetch()) {
        echo 'ID: '.$id.'<br>';
        echo 'First Name: '.$first_name.'<br>';
        echo 'Last Name: '.$last_name.'<br>';
        echo 'Username: '.$username.'<br><br>';
   }

   /* free results */
   $stmt->free_result();

   /* close statement */
   $stmt->close();
}

/* close connection */
$mysqli->close();

Приклад 2 для $query2використанняget_result()

$query2 = 'SELECT * FROM table WHERE id = ?'; 
$id = 5;

if($stmt = $mysqli->prepare($query)){
   /*
        Binds variables to prepared statement

        i    corresponding variable has type integer
        d    corresponding variable has type double
        s    corresponding variable has type string
        b    corresponding variable is a blob and will be sent in packets
   */
   $stmt->bind_param('i',$id);

   /* execute query */
   $stmt->execute();

   /* Get the result */
   $result = $stmt->get_result();

   /* Get the number of rows */
   $num_of_rows = $result->num_rows;



   while ($row = $result->fetch_assoc()) {
        echo 'ID: '.$row['id'].'<br>';
        echo 'First Name: '.$row['first_name'].'<br>';
        echo 'Last Name: '.$row['last_name'].'<br>';
        echo 'Username: '.$row['username'].'<br><br>';
   }

   /* free results */
   $stmt->free_result();

   /* close statement */
   $stmt->close();
}

/* close connection */
$mysqli->close();

Як ви можете бачити , ви не можете використовувати bind_resultз *. Однак get_resultпрацює і для обох, але bind_resultпростіше і призводить до неприємностей $row['name'].


bind_result ()

Плюси:

  • Простіший
  • Не потрібно возитися $row['name']
  • Використовує fetch()

Мінуси:

  • Не працює з SQL-запитом, який використовується *

get_result ()

Плюси:

  • Працює з усіма операторами SQL
  • Використовує fetch_assoc()

Мінуси:

  • Потрібно возитися із змінними масиву $row[]
  • Не такий акуратний
  • потрібен власний драйвер MySQL ( mysqlnd )

8
OMG, хотілося б, щоб я знайшов ці запитання ДО того, як зв’язав все з a $row[]. Дякую за детальне пояснення! Одна обережність; відповідно до інструкції get_result () доступний лише з mysqlnd.
Sablefoste

2
@SableFoste Правильно! А це означає ... вам потрібно возитися з конфігураціями ... так що ... використовуйте bind_result.
тест

1
для всіх, де метод get_result () не працює: stackoverflow.com/questions/8321096/…
Карл Адлер,

3
get_result () також не працював для мене у другому прикладі - продовжував повертати False та errno = 0 (без помилки). Видалення виклику store_result () виправило це.
виграно

1
@Black він зберігає властивості запиту ... як кількість повернутих рядків тощо
Аріан Фауртош,

2

Приклади ви можете знайти на відповідних сторінках керівництва.

Хоча плюси і мінуси досить прості:

  • get_result - єдиний розумний спосіб обробки результатів
  • проте він не завжди доступний, і ваш код повинен мати резервну копію з використанням потворного bind_result.

У будь-якому випадку, якщо ваша ідея полягає у використанні будь-якої функції прямо в коді програми - ця ідея помилкова. Але поки у вас є їх інкапсульовані в якомусь методі для повернення ваших даних із запиту, насправді не має значення, який із них використовувати, крім того, що для реалізації bind_result вам знадобиться в десять разів більше коду.


1
<b> Фатальна помилка </b>: Виклик невизначеного методу mysqli_stmt :: get_result (), наведений вище код дає таку помилку
Kissa Mia

1
Вибачте, але я не вважаю bind_result () некрасивим ... Чи можете Ви пояснити, де потворність?
Семюель Рамзан

1

Основна різниця, яку я помітив, полягає в тому , що при спробі кодувати вкладений $ stmt всередині іншого $ stmt , який отримується (без ), bind_result()виникає помилка :2014mysqli::store_result()

Помилка підготовки: (2014) Команди не синхронізовані; ви не можете запустити цю команду зараз

Приклад:

  • Функція, що використовується в основному коді.

    function GetUserName($id)
    {
        global $conn;
    
        $sql = "SELECT name FROM users WHERE id = ?";
    
        if ($stmt = $conn->prepare($sql)) {
    
            $stmt->bind_param('i', $id);
            $stmt->execute();
            $stmt->bind_result($name);
    
            while ($stmt->fetch()) {
                return $name;
            }
            $stmt->close();
        } else {
            echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
        }
    }
    
  • Основний код.

    $sql = "SELECT from_id, to_id, content 
            FROM `direct_message` 
            WHERE `to_id` = ?";
    if ($stmt = $conn->prepare($sql)) {
    
        $stmt->bind_param('i', $myID);
    
        /* execute statement */
        $stmt->execute();
    
        /* bind result variables */
        $stmt->bind_result($from, $to, $text);
    
        /* fetch values */
        while ($stmt->fetch()) {
            echo "<li>";
                echo "<p>Message from: ".GetUserName($from)."</p>";
                echo "<p>Message content: ".$text."</p>";
            echo "</li>";
        }
    
        /* close statement */
        $stmt->close();
    } else {
        echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
    }
    

Це насправді не зовсім вірно ... Ви використовуєте bind_resultнеправильно
Аріан Фауртош

1
Якщо ви використовуєте $stmt->store_result()це, це дозволить вам робити вкладені $stmtвсередину інші$stmt
Аріан Фауртош,

@ArianFaurtosh, що я роблю не так? Документація про mysqli_stmt::bind_resultPHP.net не говорить мені нічого про мою помилку ... Або це хороша практика $stmt->store_result()?
Норман Еденс,

@ArianFaurtosh, я думав, що якщо mysql_store_result ()надсилає великий набір результатів, це може стати проблемою, або я помиляюся? Так, для цього прикладу, можливо, це не так важливо, однак ... У будь-якому випадку, thnx за виправлення мене :)
Норман Еденс

1

get_result () тепер доступний лише в PHP, встановивши власний драйвер MySQL (mysqlnd). У деяких середовищах встановлення mysqlnd може бути неможливим або бажаним.

Незважаючи на це, ви все ще можете використовувати mysqli для виконання запитів 'select *' та отримання результатів з іменами полів - хоча це дещо складніше, ніж використання get_result (), і передбачає використання функції php call_user_func_array (). Див. Приклад у розділі Як використовувати bind_result () замість get_result () у php, який робить простий запит 'select *' і виводить результати (з іменами стовпців) до таблиці HTML.


0

Я думаю, що приклад 2 буде працювати лише так, оскільки store_result та get_result отримують інформацію з таблиці.

Тож прибирайте

/* Store the result (to get properties) */
$stmt->store_result();

І трохи змінити порядок. Це кінцевий результат:

$query2 = 'SELECT * FROM table WHERE id = ?'; 
$id = 5;

if($stmt = $mysqli->prepare($query)){
 /*
    Binds variables to prepared statement

    i    corresponding variable has type integer
    d    corresponding variable has type double
    s    corresponding variable has type string
    b    corresponding variable is a blob and will be sent in packets
 */
$stmt->bind_param('i',$id);

/* execute query */
$stmt->execute();

/* Get the result */
$result = $stmt->get_result();

/* Get the number of rows */
$num_of_rows = $result->num_rows;

while ($row = $result->fetch_assoc()) {
    echo 'ID: '.$row['id'].'<br>';
    echo 'First Name: '.$row['first_name'].'<br>';
    echo 'Last Name: '.$row['last_name'].'<br>';
    echo 'Username: '.$row['username'].'<br><br>';
}

/* free results */
$stmt->free_result();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.