1

我正在尝试对 MySQL 数据库执行一个简单的操作:我的联系人的全名位于一个名为first_name而该列为last_name空的列上。

所以我想取出first_name列上的内容并在第一次出现空白时将其拆分,并将第一部分放在first_name列上,将第二部分放在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->querywhile 来打开语句吗?

最好的祝福。

更新

$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

我可以使用$connection->querywhile 来打开语句吗?

是的。它将返回一个新的结果对象或只是一个布尔值,具体取决于 SQL 查询,请参阅http://php.net/mysqli_query - 在您运行查询的情况下,如果失败,如果它有效UPDATE,它将始终返回一个布尔值。FALSETRUE

顺便说一句,Mysqli 连接对象不是Mysqli 语句对象,因此它们通常不会相互干扰(在某些情况下断开连接可能会破坏/破坏某些语句,但我认为这是您可以忽略的问题的边缘情况片刻)。

我想知道你为什么要问。也许你应该改进你解决问题的方式?

于 2013-01-16T12:48:55.993 回答
0

在给定时间我只能有一个活动语句,因此我必须通过该$connection->query()方法进行其中一个查询。

正如@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 回答