1

MySQL データベースで簡単な操作を実行しようとしています。連絡先はfirst_name、列last_nameが空のときに呼び出される列に完全な名前を持っています。

first_nameしたがって、列にあるものを取り出して、最初に出現する空白で分割し、最初の部分をfirst_name列に、2 番目の部分を列に配置したいと考えていlast_nameます。

次のコードを使用していますが、機能していません。

$connection = new mysqli(DATABASE_SERVER, DATABASE_USERNAME, DATABASE_PASSWORD, DATABASE_NAME, DATABASE_PORT);

$statement = $connection->prepare("SELECT id, first_name FROM contacts");

$statement->execute();

$statement->bind_result($row->id, $row->firstName);

while ($statement->fetch()) {
  $names = separateNames($row->firstName);

  $connection->query('UPDATE contacts SET first_name="'.$names[0].'", last_name="'.$names[1].'" WHERE id='.$row->id);
}

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

$connection->close();

$connection->queryステートメントを開いたまま、を使用できますか?

よろしくお願いします。

アップデート

$connection->query(...)戻りFALSE、次のエラーが表示されます。

PHP Fatal error:  Uncaught exception 'Exception' with message 'MySQL Error - 2014 : Commands out of sync; you can't run this command now'

コードを次のように変更して動作しました。

$connection = new mysqli(DATABASE_SERVER, DATABASE_USERNAME, DATABASE_PASSWORD, DATABASE_NAME, DATABASE_PORT);

$result = $connection->query("SELECT id, first_name FROM contacts");

while ($row = $result->fetch_row()) {
  $names = separateNames($row[1]);

  $connection->query('UPDATE contacts SET first_name="'.$names[0].'", last_name="'.$names[1].'" WHERE id='.$row[0]);
}

$connection->close();
4

2 に答える 2

0

アクティブなステートメントは一度に 1 つしか持てないため、$connection->query()メソッドを介してクエリの 1 つを作成する必要がありました。

@hakreが述べたように:

更新値を適切にエンコードするには、 query() の代わりに準備済みステートメントを実行する必要がある (する必要があります) という私の提案を今でも続けています。

更新クエリにステートメント メソッドを使用することにしたので、最終的な作業コードは次のようになります。

$connection = new mysqli(DATABASE_SERVER, DATABASE_USERNAME, DATABASE_PASSWORD, DATABASE_NAME, DATABASE_PORT);

$result = $connection->query("SELECT id, first_name FROM contacts");

$statement = $connection->prepare("UPDATE contacts SET first_name=?, last_name=? WHERE id=?");

while ($row = $result->fetch_row()) {
  $names = separateNames($row[1]);

  $statement->bind_param('ssi', $names[0], $names[1], $row[0]);
  throwExceptionOnMySQLStatementError($statement, "Could not bind parameters", $logger);

  $statement->execute();
  throwExceptionOnMySQLStatementError($statement, "Could not execute", $logger);
}

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

$connection->close();

情報を提供してくれたすべての人、特にこの最終的な解決策にたどり着くのを助けてくれた @hakre に感謝します。

于 2013-01-23T12:55:21.857 に答える
0

$connection->queryステートメントを開いたまま、を使用できますか?

はい。SQLクエリに応じて、新しい結果オブジェクトまたは単なるブール値を返します。http://php.net/mysqli_queryを参照してください-クエリを実行する場合、失敗した場合、機能した場合UPDATEは常にブール値を返します。FALSETRUE

ところで、Mysqli 接続オブジェクトMysqli ステートメント オブジェクトではないため、通常は互いに干渉しません (状況によっては、接続を切断すると一部のステートメントが破壊/破損する可能性がありますが、これはあなたの質問のエッジ ケースであると考えます。一瞬)。

なぜあなたが実際に尋ねるのだろうか。トラブルシューティングの方法を改善する必要があるのではないでしょうか。

于 2013-01-16T12:48:55.993 に答える