简体   繁体   English

预准备语句中的PHP MySQLi查询

[英]PHP MySQLi Query within Prepared Statement

I'm in the process of updating from MySQL to MySQLi and have come across an issue I'm not sure how to handle with MySQLi/prepared statements. 我正在从MySQL更新到MySQLi的过程中,遇到一个我不确定如何处理MySQLi /准备好的语句的问题。

In my previous code, I had a query within a query: 在我之前的代码中,我在查询中有一个查询:

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>';
}

However, with my prepared statements, I'm not sure how to run a query within a query: 但是,对于我准备好的语句,我不确定如何在查询中运行查询:

$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();

Is it possible to do this with prepared statements? 使用准备好的语句可以做到这一点吗? I basically need to hit the database to get data in a secondary query based on values received during the first query. 我基本上需要访问数据库以根据第一个查询期间接收到的值在辅助查询中获取数据。 Thank you! 谢谢!

Executing queries inside a loop is a bad practice and should be avoided, because of performance issues. 在循环中执行查询是一种不好的做法,由于性能问题,应该避免执行查询。

Given the code and query you posted, I suggest you to modify your first sql statement: 给定您发布的代码和查询,建议您修改第一个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

This will fetch the data you need, in one single request, avoiding several calls to your DBMS. 这将在一个请求中获取所需的数据,从而避免了对DBMS的多次调用。 Then, in your php code, you can access the user columns without a new query: 然后,在您的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'];

There are some good tutorials about joins you should read. 有一些关于联接的好的教程,您应该阅读。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM