【问题标题】:PHP MySQLi Query within Prepared Statement准备好的语句中的 PHP MySQLi 查询
【发布时间】: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 -&gt; get_result(); 之后立即发出$stmt -&gt; close() 吗?
  • 好吧,我从来没有真正使用过 close 功能(无论如何我都在使用 PDO)。但是如果你之前不获取它们,你会杀死你的结果。 mysqli_stmt_close 的 cmets 声明您应该使用$stmt-&gt;reset()ch2.php.net/manual/en/mysqli-stmt.reset.php
  • 你能告诉我你为什么使用 MySQLi 而不是直接 PDO 吗? (PDO 对 Prepared Statements 进行了更清晰、更好的集成,仅供参考)
  • 你能在你的帖子中包含第一个 sql 查询吗?在循环内进行查询是一个非常糟糕的主意。您可能可以重写此代码并只执行一个查询来检索您需要的所有信息(例如使用连接查询)

标签: php mysql mysqli prepared-statement


【解决方案1】:

在循环中执行查询是一种不好的做法,应该避免,因为存在性能问题。

鉴于您发布的代码和查询,我建议您修改您的第一个 sql 语句:

SELECT a.REMINDER_TIME, a.USER_ID, b.FIRST_NAME, b.LAST_NAME, b.EMAIL
FROM TABLE_logs_reminders a
LEFT JOIN table_users b on a.user_id = b.user_id
WHERE REQUEST_ID=?
ORDER BY a.REMINDER_TIME

这将在一个请求中获取您需要的数据,避免多次调用您的 DBMS。 然后,在您的 php 代码中,您无需新查询即可访问用户列:

//_____QUERY WOULD GO HERE_____
// No need for a query
$REMINDER_USER_FIRST = $record1['FIRST_NAME'];
$REMINDER_USER_LAST = $record1['LAST_NAME'];
$REMINDER_USER_EMAIL = $record1['EMAIL'];

您应该阅读一些关于联接的好教程。

【讨论】:

  • 感谢您的帮助。我试过这个查询,但 SQL 说 LEFT JOIN 附近有语法错误。这是查询:SELECT a.REMINDER_TIME, a.USER_ID, b.FIRST_NAME, b.LAST_NAME, b.EMAIL FROM TABLE_logs_reminders a WHERE REQUEST_ID=? ORDER BY a.REMINDER_TIME LEFT JOIN TABLE_users b ON a.USER_ID = b.USER_ID;
  • 我刚刚编辑了我的答案。 order by 子句必须在 join 之后。
  • 感谢您的快速回复!不幸的是,我仍然遇到语法错误。奇怪。
  • 好的 - 我想我修好了。 WHERE 子句也必须放在最后。
  • 是的!我编辑了答案。我复制/粘贴了您的原始查询,完全忘记移动这些子句...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
相关资源
最近更新 更多