【问题标题】:Help with a SQL syntax error message有关 SQL 语法错误消息的帮助
【发布时间】:2010-02-18 09:47:25
【问题描述】:
<?php

switch($_GET["action"])
{
case "add_item":
{
AddItem($_GET["idc"], $_GET["qty"]);
ShowCart();
break;
}
case "update_item":
{
UpdateItem($_GET["idc"], $_GET["qty"]);
ShowCart();
break;
}
case "remove_item":
{
RemoveItem($_GET["idc"], $_GET["id"]);
ShowCart();
break;
}
default:
{
ShowCart();
}
}
function AddItem($itemId, $qty){


$result = mysql_query("SELECT COUNT(*) FROM cart WHERE cookieId = '" . GetCartId() . "' AND id = $itemId");

$row = mysql_fetch_row($result);
$numRows = $row[0];

if($numRows == 0)
{
// This item doesn't exist in the users cart,
// we will add it with an insert query

mysql_query("INSERT INTO cart(cookieId, id, qty) values('" . GetCartId() . "', $itemId, $qty)");
//printf ("Inserted records: %d\n", mysql_affected_rows());

}
else
{
// This item already exists in the users cart,
// we will update it instead
 mysql_query("UPDATE cart SET qty = $qty WHERE cookieId = '" . GetCartId() . "' AND id = $itemId");

}

}

function UpdateItem($itemId, $qty)
{

mysql_query("UPDATE cart SET qty = $qty WHERE cookieId = '" . GetCartId() . "' AND id = $itemId");
//printf ("Updated records: %d\n", mysql_affected_rows());

}

function RemoveItem($itemId) 
{

mysql_query("DELETE FROM cart WHERE cookieId = '" . GetCartId() . "' AND id = $itemId");
}

?>

<?php 
function ShowCart()

{
    $result = mysql_query("SELECT
                  cart.id         cart_id,
                  cart.id         cart_id,
                  cart.cartId     cartId,
                  cart.cookieId   cookie_Id,
                  cart.qty        qt_y,                     
                  cdkb.id         cdkb_id,
                  cdkb.name       name,
                  cdkb.image      image,
                  cdkb.price      price,
                  dkb.id          dkb_id,
                  dkb.name        name1, 
                  dkb.image       image1,
                  dkb.price       price2,
                  dbl.product_id  product_id,
              dbl.price       price3,
              dbl.variety     variety,
              dbl.description description                  
FROM
        cart


        LEFT OUTER JOIN cdkb
           ON cart.id = cdkb.id    

        LEFT OUTER JOIN dkb
           ON cart.id = dkb.id

        LEFT OUTER JOIN dbl
           ON dbl.id = dkb.id 


    WHERE
        cart.cookieId ='" . GetCartId() . "' ' ORDER BY cdkb.name AND dkb.name ASC");

    <div id="cart">
<div id="group">
<div id="quantity">Qty</div>
<div id="cartpic">Pic</div>
<div id="product">Product</div>
<div id="cartprice">Price</div>
<div id="remove">Remove</div>
</div>
<?php

$totalCost=0;
while($row = mysql_fetch_array($result))
{  
// Increment the total cost of all items
$totalCost += ($row["qt_y"] * $row["price1"]);

?>

<div id="cart1">
<select name="<?php echo $row["ckb_id"];?>" onChange="UpdateQty(this)">
<?php  print($row["ckb_id"]);?>
<?php

for($i = 1; $i <= 30; $i++)
{
echo "<option ";
if($row["qt_y"] == $i)
{
echo " SELECTED ";
}
echo ">" . $i . "</option>";
}
?>
</select>
</div>
<div id="cart2">
<img src="images/logopic.gif"<?php /*?><?php echo $row["image1"]; ?><?php */?> alt="we" width="60" height="50" />
</div>
<div id="cart3"><p><?php echo $row["dishname1"]; ?></p></div>



<div id="cart4"><p>
$<?php echo number_format($row["price3"], 2, ".", ","); ?></p></div>

<div id="cart5">
<p><?php
printf('<a href="cart.php?action=remove_item&id=%d&idc=%d&register=%s">Remove</a>', $_GET['id'], $row['ckb_id'], $_GET['register']);
?></p></div>

<hr size="1" color="red" >

<script language="JavaScript">

function UpdateQty(item)
{
itemId = item.name;
newQty = item.options[item.selectedIndex].text;

document.location.href = 'cart.php?action=update_item&id='+itemId+'&qty='+newQty;
}

</script>





<?php
}
?>

<font face="verdana" size="2" color="black" style="clear:right;">
<b>Total: $<?php echo number_format($totalCost, 2, ".", ","); ?></b></font></td>


<?php
}
?>

以上是cart.php 的更新代码和查询。如果您注意到查询下方有一个 while 循环。现在,为 dkb 表设置了 while 循环,这些表是来自 page1.php 的项目。这个循环的设置方式是重复保存、显示和管理 ecah 项目数量、图像、名称、价格和删除选项,显示它们并根据用户选择的多个项目重复它们。好吧,这些字段的设置和设计并不完全适用于来自 page2.php 的项目,购物车中显示的信息是从 dkb 和 dbl 表中提取的。现在的问题是,当从 page2.php 到购物车时,相同的项目名称重复了 3 次,因为在 dbl 表中的设计如下。

INSERT INTO `dbl` (`id`, `price`, `variety`, `description`) VALUES
(1, 20.30, 'Small Tray', 'Serves 6 to 8 people' ),
(1, 25.90, 'Medium Tray', 'Serves 12 to 15 people'),
(1, 30.90, 'Large Tray', 'Serves 18 to 21 people'),
(136, 0.00, 'Small Tray', '', 'small'),
(136, 0.00, 'Medium Tray', '' ),
(136, 0.00, 'Large Tray', ''),
(2, 0.00, 'Small Tray', ''),
(2, 0.00, 'Medium Tray', ''),
(2, 0.00, 'Large Tray', '');

上面的插入假设是 dkb 的三个项目,在查询 dbl.id=dkb.id 中查看它在 dkb.id 上连接的 dbl.id 好吧 dbl.id 对 dkb 表中的一个项目有三个价格case 是项目 1 的三个价格,项目 136 的三个价格和项目 2 的三个价格。所以它是三个不同的品种,以及在 dkb 中对这些项目中的每一个的描述。从现在开始,如果您查看查询下方 while 循环中分配的字段,其中一些是来自 cdkb 和 dbl 的 dkb。现在,正如我所说的那样,从 dkb 表中的信息来看,在 while 循环中的设置上面的一些地方是可以的,该表只有一个价格和一个名称。我在想的一些是安排一个 if 语句条件来检测信息来自 page1.php 的位置,这是一个名称和价格,或者来自 page2.php 的一个名称,从一到三个价格和品种取决于用户选择的小、中或大托盘。每个托盘都有一个价格,但它将是一个名称 1、136 或 2,它们是来自 dkb 表的 id。在while循环内的if语句中显示page2.php中需要一到三个价格和品种的信息将有一个foreach循环或者一个for循环不知道用户在page2中选择了多少品种。 php 在 if 语句的帮助下将其显示在购物车的 while 循环中,该语句将检测从 page1.php 或 page2.php 中选择的天气。

$result = mysql_query("SELECT * FROM .... LEFT OUTER JOIN .... WHERE") // This is the query we have discussed in this forum.
 while($row = mysql_fetch_array($result))
{  if($row['cdkb_id']){
echo "<div>qty</div>";
echo"<div>". $row['image'] . "</div>";
echo"<div>". $row['name'] . "</div>";
echo"<div>". $row['price'] . "</div>";
echo"<div>remove</div>";
}
else{
echo "<div>qty</div>";
echo"<div>". $row['image1'] . "</div>";
echo"<div>". $row['name1'] . "</div>";
foreach ($row['dkb_id'] as $variety) {
echo"<div>".$variety['variety']. $variety['price3'] . "</div>";
// the vriety and price3 field will display three times as in table dbl has three prices and three variety. It is correct to use a foreach loop for  in this case?}
echo"<div>remove</div>"; 
// end of foreach loop inside the else statement
}// end of if else statement
}// end of while loop
?>

因此,作为最终产品进行搜索和呈现的最终显示和插图如下所示,这就是所需的外观。

 while($row = mysql_fetch_array($result))
{  
if (table cdkb) { 
  [1]qyt         image      name          price        remove
     1            ---       marina        $18.90        remove?    
     }end of if statement
Else table dkb {
   1]qyt            Image         Name             Price                  Remove
     1               ---         marina         Small Tray  $18.90        remove? 
                                                Medium Tray $30.24
                                                Large Tray  $35.90
                  } // end of else statement

                  }//end of while loop

请给我最后的帮助。

【问题讨论】:

标签: php sql


【解决方案1】:

在我看来,你后面的逗号太多了:

dbl.id dbl_id

编辑: 查询中的另一个错误是您正在引用表 dbl 中的字段:

dbl.id dbl_id

但您没有将该表加入查询,因此 dbl.id 是一个未知实体。

【讨论】:

  • 也非常感谢,逗号停止了查询的执行,现在请善待并查看第一篇文章中的编辑部分。我有 dkb.id dkb_id, dkb.price price1, dkb.name name1,但是他们不会通过 php 在 html 上显示任何数据是空的不知道为什么。
  • 为什么不自己运行查询?启动 mysql 监视器,剪切和粘贴查询,看看有什么数据通过。如果您首先没有检查查询本身是否正常工作,那么试图找出 PHP 不输出内容的原因是没有用的。可能是您的 PHP 代码运行良好,而查询返回 null 或空字符串或其他任何内容。
  • 什么是 mysql 监控 phpmyadmin 中的 RUN mysql 查询/查询框?
  • 如果我有许多其他字段我不会在购物车中使用,我必须以任何方式在 SELECT 中指定它们,即使我不会使用它们?
  • 不,您只需选择您需要的。是的,你也可以在 phpmyadmin 中运行查询。
【解决方案2】:

您的 SELECT 在最后一个字段的末尾有一个逗号。你应该删除那个逗号。

SELECT
cart.id    cart_id,
dkb.id     dkb_id,
cdkb.id    cdkb_id,
dbl.id     dbl_id, <-- comma here isn't needed

【讨论】:

  • 非常感谢逗号停止执行查询,现在请善待并查看第一篇文章中的编辑部分。我有 dkb.id dkb_id, dkb.price price1, dkb.name name1,但是他们不会通过 php 在 html 上显示任何数据是空的不知道为什么。
  • 您发布的代码中仍有逗号。您没有检查查询是否实际执行,因此 mysql_fetch_array 将引发警告,但如果您将 error_reporting 设置为不显示错误,您可能看不到它。确保在 mysql_query 之后检查 $result === false 是否表明是否发生错误。
  • comman 已修复 我放了最后一个代码,但在服务器中我已经修复了 comman 谢谢。这就像 if ($result===false){ echo "
    mysql_error : ".mysql_error()."
    "; echo "mysql_errno : ".mysql_errno()."
    "; } 请善待并说明您所说的内容。
【解决方案3】:

如果 $_GET['is'] 未设置,您的查询也会失败。您将值 null 分配给 $is 和 $ic,而不是字符串“null”。字符串上下文中的空值是一个空白字符串 (''),因此您最终会得到 ON ( cart.id = dkb.id and dkb.id = ),这是一个语法错误。

您必须将初始分配更改为以下内容:

$ic= isset($_GET['is']) ? '= ' . (int)$_GET['is'] : 'is null';

【讨论】:

  • 谢谢 Marc B 我确实改变了它,但它仍然没有显示字段值,你有没有其他想法为什么会发生这种情况
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 2011-05-12
  • 1970-01-01
相关资源
最近更新 更多