这是使用php和$u POST变量查询2个mysql表的正确方法吗?
我一直在试图找出从数据库返回订单的最佳方式。我已经想到了这个,它正在以我想要的方式工作(我认为),它给了我我想要的结果,但我想知道它是否正确,或者是否有更好的方法这是使用php和$u POST变量查询2个mysql表的正确方法吗?,php,mysql,Php,Mysql,我一直在试图找出从数据库返回订单的最佳方式。我已经想到了这个,它正在以我想要的方式工作(我认为),它给了我我想要的结果,但我想知道它是否正确,或者是否有更好的方法 <?php $conn = mysql_connect('', '', ''); if (!$conn) { die('Could not connect: ' . mysql_error()); } mysql_select_db($dbs, $conn); $Order_ID = $_POST['Order_I
<?php
$conn = mysql_connect('', '', '');
if (!$conn)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db($dbs, $conn);
$Order_ID = $_POST['Order_ID'];
//$Order_ID = '1001';
$queryOrderHead = "SELECT * FROM Orders WHERE Order_ID = '$Order_ID' ";
$queryOrderLines = "SELECT *
FROM Order_LineDetails
WHERE Order_LineDetails.Order_ID = '$Order_ID'
";
if ($queryRunHead = mysql_query($queryOrderHead)){
while ($info_HEAD = mysql_fetch_array($queryRunHead))
{
$OrderID_HEAD = $info_HEAD['Order_ID'];
$User_ID_HEAD = $info_HEAD['User_ID'];
$Customer_ID_HEAD = $info_HEAD['Customer_ID'];
echo $OrderID_HEAD.' '.$User_ID_HEAD.' '.$Customer_ID_HEAD.'<br>';
}
$queryRunLines = mysql_query($queryOrderLines);
while ($info = mysql_fetch_array($queryRunLines))
{
$OrderID = $info['Order_ID'];
$OrderLineID = $info['OrderLineItem_ID'];
echo $OrderID.' '.$OrderLineID.'<br>';
}
} else {
echo mysql_error();
}
mysql_close($conn);
?>
因此,它所做的就是使用$\u POST中的Order\u ID
val并运行第一个查询,然后在成功时使用相同的Order\u ID
并循环第二个查询,并从不同的表中获取所有Order\u LineDetails
除了mysql\u real\u escape()
标记之外
有什么建议或想法吗
有什么建议或想法吗
首先选择订单,然后选择其项目没有什么错。但是,将数据组织到数组结构中以及遵循更好的命名约定(对于变量和数据库模式)会使您受益匪浅:
$orderId=$\u POST['order\u id'];
//order_id应该是INT,所以没有引号。
//还可以使用PDO查看参数化查询,因为mysql_*函数已经过时了!
$sqlOrder=“选择*
从命令
其中order_id=“.mysql_real_escape_字符串($orderId);
$order=array();
if($resOrder=mysql\u查询($sqlOrder)){
if($rowOrder=mysql\u fetch\u数组($resOrder)){
$order=$rowOrder;
//echo$rowOrder['order\u id'.'。$rowOrder['user\u id'.'.'。$rowOrder['customer\u id'.]。“
\n”;
$sqlOrderLines=“选择*
从订单行
其中order_lines.order_id=“.mysql_real_escape_string($orderId));
if($resOrderLines=mysql\u查询($sqlOrderLines)){
$order['order_lines']=array();
而($rowOrderLines=mysql\u fetch\u数组($resOrderLines)){
$order['order_lines'][]=$rowOrderLines;
//echo$rowOrderLines['order\u id'.'。$rowOrderLines['order\u line\u id'.]。“
\n”;
}
}
}否则{
回显“未找到订单”。
}
}否则{
echo mysql_error();
}
//调试
打印(订单);
您可以消除对数据库的两个调用,只需进行一个调用,根据订单ID将两个表连接在一起。因此类似于选择O.order\u ID、O.user\u ID、O.Customer\u ID,O.OrderLIneItem\u ID FROM Orders O LEFT JOIN order\u lineDetails OLD ON O.order\u ID=OLD.order\u ID其中O.order\u ID='$order\u ID'
理论上这应该更快,因为对数据库的调用更少,但是,您为每个记录返回了更多的数据,这可能会根据复制的数据量而抵消其好处。如果第一个查询始终返回1行数据,而第二个查询可能返回1到100多行数据,会怎么样?您选择的是订单,然后是订单项。这种方法没有错。放入数组将更好地组织。请确保清除post变量的值,例如,$Order\u ID=intval($\u post['Order\u ID'])代码>避免。解释否决票。他需要这样的指针。
$orderId = $_POST['order_id'];
// order_id should be an INT, so no quotes.
// Also look into parameterized queries with PDO as the mysql_* functions are archaic!
$sqlOrder = "SELECT *
FROM orders
WHERE order_id = ".mysql_real_escape_string($orderId);
$order = array();
if ($resOrder = mysql_query($sqlOrder)) {
if ($rowOrder = mysql_fetch_array($resOrder)) {
$order = $rowOrder;
// echo $rowOrder['order_id'].' '.$rowOrder['user_id'].' '.$rowOrder['customer_id']."<br />\n";
$sqlOrderLines = "SELECT *
FROM order_lines
WHERE order_lines.order_id = ".mysql_real_escape_string($orderId);
if ($resOrderLines = mysql_query($sqlOrderLines)) {
$order['order_lines'] = array();
while ($rowOrderLines = mysql_fetch_array($resOrderLines)) {
$order['order_lines'][] = $rowOrderLines;
// echo $rowOrderLines['order_id'].' '.$rowOrderLines['order_line_id']."<br />\n";
}
}
} else {
echo 'Order not found'.
}
} else {
echo mysql_error();
}
// debug
print_r($order);