【发布时间】:2014-08-12 20:39:43
【问题描述】:
我正在从 MySQL 更新到 MySQLi,遇到了一个问题,我不确定如何处理 MySQLi/prepared 语句。
在我之前的代码中,我在查询中有一个查询:
while ($record = mysql_fetch_array($result))
{
//CLEAR VARIABLES
$REMINDER_TIME = '';
$REMINDER_USER_ID = '';
//STORE DATA
$REMINDER_TIME = $record['REMINDER_TIME'];
$REMINDER_USER_ID = $record['USER_ID'];
//LOCALIZE TIMES
$REMINDER_TIME = new DateTime($REMINDER_TIME);
$REMINDER_TIME->setTimeZone(new DateTimeZone($user_timezone));
//GET USER NAME
$result1 = mysql_query("SELECT FIRST_NAME, LAST_NAME, EMAIL FROM TABLE_users WHERE USER_ID='$REMINDER_USER_ID'");
while ($record1 = mysql_fetch_array($result1))
{
//CLEAR VARIABLES
$REMINDER_USER_FIRST = '';
$REMINDER_USER_LAST = '';
$REMINDER_USER_EMAIL = '';
//STORE DATA
$REMINDER_USER_FIRST = $record1['FIRST_NAME'];
$REMINDER_USER_LAST = $record1['LAST_NAME'];
$REMINDER_USER_EMAIL = $record1['EMAIL'];
}
$tableRow .= '<tr>
<td class="tall">'.$REMINDER_TIME->format('F j, Y').'<br />'.$REMINDER_TIME->format('g:ia T').'</a></td>
<td class="tall">'.$REMINDER_USER_FIRST.' '.$REMINDER_USER_LAST.'<br />('.$REMINDER_USER_EMAIL.')</td>
</tr>';
}
但是,对于我准备好的语句,我不确定如何在查询中运行查询:
$result = $stmt -> get_result();
while ($row = $result -> fetch_array(MYSQLI_ASSOC))
{
//CLEAR VARIABLES
$REMINDER_TIME = '';
$REMINDER_USER_ID = '';
//STORE DATA
$REMINDER_TIME = $row['REMINDER_TIME'];
$REMINDER_USER_ID = $row['USER_ID'];
//LOCALIZE TIMES
$REMINDER_TIME = new DateTime($REMINDER_TIME);
$REMINDER_TIME->setTimeZone(new DateTimeZone($user_timezone));
//_____QUERY WOULD GO HERE_____
$tableRow .= '<tr>
<td class="tall">'.$REMINDER_TIME->format('F j, Y').'<br />'.$REMINDER_TIME->format('g:ia T').'</a></td>
<td class="tall">'.$REMINDER_USER_FIRST.' '.$REMINDER_USER_LAST.'<br />('.$REMINDER_USER_EMAIL.')</td>
</tr>';
}
$stmt->close();
是否可以使用准备好的语句来做到这一点?我基本上需要根据第一次查询期间收到的值访问数据库以获取辅助查询中的数据。谢谢!
【问题讨论】:
-
我认为您的问题是您认为您正在查询中进行查询。但你不是。您只是在运行一个查询,然后使用 PHP 循环遍历结果。您可以在循环结果时执行新查询。循环是在 PHP 中而不是在 MySQL 中完成的。 MySQL 与您在循环结果时执行多少查询无关,因为它与 MySQL 无关。
-
好的,这是有道理的。我应该在
$result = $stmt -> get_result();之后立即发出$stmt -> close()吗? -
好吧,我从来没有真正使用过 close 功能(无论如何我都在使用 PDO)。但是如果你之前不获取它们,你会杀死你的结果。 mysqli_stmt_close 的 cmets 声明您应该使用
$stmt->reset()。 ch2.php.net/manual/en/mysqli-stmt.reset.php -
你能告诉我你为什么使用 MySQLi 而不是直接 PDO 吗? (PDO 对 Prepared Statements 进行了更清晰、更好的集成,仅供参考)
-
你能在你的帖子中包含第一个 sql 查询吗?在循环内进行查询是一个非常糟糕的主意。您可能可以重写此代码并只执行一个查询来检索您需要的所有信息(例如使用连接查询)
标签: php mysql mysqli prepared-statement