布尔值不会更改为false

时间:2014-11-03 21:40:08

标签: php

当用户销售商品时,它会提供资金并使其成为虚假,但此程序正在提供资金,但不会将布尔值设置为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"); ?>

1 个答案:

答案 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()。如果准备一个带有绑定占位符值而不是布尔变量的语句,则可以避免今天的问题。