0

$mysqli->prepare($query)2番目のステートメントで動作しなくなるのはなぜですか?

$mysqli = @new mysqli(HOSTNAME, USERNAME, PASSWORD, DATABASE);
...
if ($stmt = $mysqli->prepare($query)) {
    // Code is working fine
    ...
    if ($stmt2 = $mysqli->prepare($query2)) {
        // Code does not work
        ...
    }
}

そして、接続を繰り返しても問題なく動作しmysqliます:

$mysqli = @new mysqli(HOSTNAME, USERNAME, PASSWORD, DATABASE);
$mysqli2 = @new mysqli(HOSTNAME, USERNAME, PASSWORD, DATABASE);
...
if ($stmt = $mysqli->prepare($query)) {
    // Code is working fine
    ...
    if ($stmt2 = $mysqli2->prepare($query2)) {
        // Code is working fine
        ...
    }
}

2番目のステートメントの繰り返しmysqli接続を避けるには?prepare


更新: 私が見るように、コミュニティは実際の例を望んでいます:

データを含むdb テーブルfruits:

CREATE TABLE IF NOT EXISTS `fruits` (
  `id` varchar(8) NOT NULL,
  `group` varchar(8) NOT NULL,
  `name` varchar(250) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `fruits` (`id`, `group`, `name`) VALUES
('03E7', '', 'Berries'),
('0618', '03E7', 'blueberry'),
('051B', '03E7', 'raspberry'),
('02AA', '03E7', 'strawberry'),
('035F', '', 'Citrus'),
('07A5', '035F', 'grapefruit'),
('0633', '035F', 'lime'),
('05E1', '', 'Pear');

PHP スクリプト:

<?php

$mysqli = new mysqli('localhost', 'root', 'password', 'test');
//$mysqli2 = new mysqli('localhost', 'root', 'password', 'test');

$query1 = "SELECT id, name FROM fruits WHERE `group`=''";
$query2 = "SELECT name FROM fruits WHERE `group`=?";

$stmt1 = $mysqli->stmt_init();
$stmt2 = $mysqli->stmt_init();
//$stmt2 = $mysqli2->stmt_init();

if($stmt1->prepare($query1)){
    $stmt1->execute();
    $stmt1->bind_result($id, $name1);

    while($stmt1->fetch()){
        echo $name1;

        if($stmt2->prepare($query2)){
            $stmt2->bind_param('s', $group);
            $group = $id;
            $stmt2->execute();
            $stmt2->bind_result($name2);

            echo ':';

            while($stmt2->fetch()){
                echo ' ' . $name2 . ',';
            }
        }

        echo '<br>';
    }
}

?>

結果:

Berries
Citrus
Pear

期待される結果:

Berries: blueberry, raspberry, strawberry,
Citrus: grapefruit, lime,
Pear:
4

2 に答える 2

1

問題を修正するには、

$stmt1 = $mysqli->stmt_init();
$stmt2 = $mysqli->stmt_init();

後に追加します$stmt1->execute();

$stmt1->store_result();

$stmt1->prepare($query1)を置き換え$stmt2->prepare($query1)ます

$stmt1 = $mysqli->prepare($query1)
$stmt2 = $mysqli->prepare($query2)
于 2012-07-10T21:32:03.353 に答える
-1

あなたのコードには次のものがありますか?

$stmt = $mysqli->stmt_init();
$stmt2 = $mysqli->stmt_init();

次に、次のことができます。

if($stmt->prepare($query)) ...
if($stmt2->prepare($query2)) ...

何が起こっているのかよくわかるように、すべてのコードを投稿してください。

編集:OK、これが私の実際の例です:

linksデータを含む私のテーブルは次のとおりです。

CREATE TABLE IF NOT EXISTS `links` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32),
  `group` varchar(32),
  `array` int(32),
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;

INSERT INTO `links` (`id`, `name`, `group`, `array`) VALUES
(1, 'link1', '', 1),
(2, 'link1-sub-link1', '1', 1),
(3, 'link1-sub-link2', '1', 1),
(4, 'link2', '', 2),
(5, 'link3', '', 2),
(6, 'link3-sub-link1', '5', 2),
(7, 'link3-sub-link2', '5', 3),
(8, 'link3-sub-link3', '5', 3);

次の php コードは、エラーなしで実行されます。

<?php
$mysqli = new mysqli("localhost", "root", "password", "things");

$query = "SELECT id, name FROM links WHERE `group`='' ORDER BY array ASC";
$query2 = "SELECT name FROM links WHERE `group`=? ORDER BY array ASC";

$stmt1 = $mysqli->stmt_init();
$stmt2 = $mysqli->stmt_init();
if($stmt1->prepare($query)){
    $stmt1->execute();
    $stmt1->bind_result($id, $name1);
    while($stmt->fetch()){
    echo $name1;
        if($stmt2->prepare($query2)){
            $stmt2->bind_param('s', $group);
            $group = $id;
            $stmt2->execute();
            $stmt2->bind_result($name2);
            while($stmt2->fetch()){
                echo 'related to: ' . $name2 . "\n";
            }
        }
    }
}
?>
于 2012-06-18T14:15:34.837 に答える