当用户销售商品时,它会提供资金并使其成为虚假,但此程序正在提供资金,但不会将布尔值设置为false。
<? require("Left.php"); ?>
<html>
<img src="images/X100.png" style="width:304px;height:228px">
<p>The X100 is a miner that was designed in 1980, it is cheap and horrible, it will yeild little gold and uses lots of fuel</p>
<table width="" height="1" border="1" align="center">
<tr>
<td>
Fuel usage
<td>50</td>
</td>
</tr>
</table>
<table width="" height="1" border="1" align="center">
<td>
Max gold per ton
<td>3</td>
</td>
</table>
<table width="" height="1" border="1" align="center">
<td>
Price
<td>6000 money</td>
</td>
</table>
<form method="post" >
<input type="submit" name="buy" id="buy" value="buy">
</form>
<? if($ownstarter == true){
echo 'Sell your X100 for 3000 money';
echo "<form method='post' > <input type='submit' name='Sell' id='Sell' value='Sell'> </form>";
}?>
</form>
</html>
<?
if (isset($_POST['buy']) and $money >= 6000 and $ownstarter == false) {
$money = $money - 6000;
$ownstarter = true;
} elseif ($money <= 6000 and $ownstarter == false) {
echo "You cannot afford this! ";
} elseif($ownstarter == true) {
echo "You already own this item!";
}
if(isset($_POST['Sell'])){
$money = $money + 3000;
$ownstarter = null;
}
$query = mysql_query($sql) or die(mysql_error());
mysql_query("UPDATE users SET ownstarter=$ownstarter WHERE id='$id'");
mysql_query("UPDATE users SET money=$money WHERE id='$id'");
?>
<? require("Right.php"); ?>
更详细地说,如果用户拥有它,则可以选择一个按钮,说明&#34;销售&#34;如果用户点击该按钮,它会给他们5000美元,并将自己的起始设置为假。但它不会把它设置为假。 (我也厌倦了将它设置为null并且它也不会工作)它确实给了钱,但没有将它设置为假,因此按钮不会消失。如果有帮助http://puu.sh/cC7Kx/69c55ce1dc.jpg
,那就是它的照片编辑:好的,所以我在查询中添加了die(mysql_error());
,我收到了这个错误:你的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在#&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在第1行,但x200页面几乎完全相同的代码(我还没有添加销售部分),它没有任何错误。
X200
<? require("Left.php"); ?>
<html>
<img src="images/X200.jpg" style="width:304px;height:228px">
<p>The X100 miner is a more efficient miner than the X100 miner, that being said, the X200 will still use alot of fuel for little gold. </p>
<table width="" height="1" border="1" align="center">
<tr>
<td>
Fuel usage
<td>70</td>
</td>
</tr>
</table>
<table width="" height="1" border="1" align="center">
<td>
Max gold per ton
<td>5</td>
</td>
</table>
<table width="" height="1" border="1" align="center">
<td>
Price
<td>1 point</td>
</td>
</table>
<form method="post" >
<input type="submit" name="buy" id="buy" value="buy">
</form>
</html>
<?
if (isset($_POST['buy']) and $points >= 1 and $ownminer1000 == false) {
$ownminer1000 = true;
$points = $points - 1;
}elseif($points < 1 and $ownminer1000 == false){
echo "You cannot afford this item!";
}elseif($ownminer1000){
echo "You already have this item!";
}
$query = mysql_query($sql) or die(mysql_error());
mysql_query("UPDATE users SET ownminer1000=$ownminer1000 WHERE id='$id'")
or die(mysql_error());
mysql_query("UPDATE users SET points=$points WHERE id='$id'")
or die(mysql_error());
?>
<? require("Right.php"); ?>
答案 0 :(得分:1)
您使用PHP布尔值true/false
作为$ownerminer1000
的值并将它们不加引号传递给MySQL查询这一事实导致了一个小问题。
当PHP将布尔值true
强制转换为字符串时(因为它必须在查询中执行),它会替换字符串1
。您对true
的查询有效,因为它扩展为:
SET ownminer1000=1 WHERE id='xxx'
当$ownerminer1000
的值为false时,PHP会将false
转换为空字符串。结果是您的查询如下所示:
SET ownminer1000= WHERE id='xxx'
---------------^^^
这些内容详见PHP's famous/infamous type juggling rules
这在语法上是无效的。如果你想继续为该变量使用布尔值,你需要在将它传递给MySQL之前进行转换。你可以通过首先将其转换为整数来轻松完成。
// true becomes 1, false becomes 0
$ownerminer1000 = intval($ownerminer1000);
mysql_query("UPDATE users SET ownminer1000=$ownminer1000 WHERE id='$id'") or die(mysql_error());
现在,查询在语法上是有效的,并且将成功为假值。
我注意到另一件事 - 您正在使用相同的UPDATE
对同一个表执行两个单独的$id
语句。您可以安全地将它们合并为一个,field=value
子句中有多个SET
对。
// Update points and ownerminer1000 at the same time
mysql_query("UPDATE users SET points=$points, ownminer1000=$ownminer1000 WHERE id='$id'") or die(mysql_error());
标准免责声明适用于mysql_*()
功能的使用。它们在一年多以前的PHP 5.5中被弃用,并且不用于新代码。相反,现在是时候开始学习使用PDO或MySQLi了。两者都是较新的API,并且都支持预备语句,这将提高查询的安全性。我们无法看到上面变量$money, $points, $id
的来源,但如果它们来自用户输入,则可能容易受到SQL注入。
这个PDO tutorial for MySQL developers非常好,并且在旧的mysql_*()
函数的上下文中构建了PDO的使用。最重要的是开始学习使用prepare()/execute()
。如果准备一个带有绑定占位符值而不是布尔变量的语句,则可以避免今天的问题。