Boolean не изменится на false

Когда пользователь продает товар, он дает деньги и делает его ложным, но эта программа дает деньги, но не устанавливает логическое значение false.

<!--? require("Left.php"); ?--> <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 border="1"> <tbody><tr> <td> Fuel usage </td><td>50</td> </tr> </tbody></table> <table border="1"> <tbody><tr><td> Max gold per ton </td><td>3</td> </tr></tbody></table> <table border="1"> <tbody><tr><td> Price </td><td>6000 money</td> </tr></tbody></table>
<!--? if($ownstarter == true){ echo 'Sell your X100 for 3000 money'; echo "<form method='post' --> ";
}?>
= 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"); ?-->

Более подробно, если пользователь владеет им, кнопку с опцией "Продать", и если пользователь нажимает кнопку, она дает им 5000 денег и устанавливает собственныйstarter в false. Но это не будет ложным. (Я тоже устал, установив его равным нулю, и он тоже не будет работать). Он дает деньги, но не устанавливает его в false, поэтому кнопка не исчезает. Heres изображение его, если это помогает http://puu.sh/cC7Kx/69c55ce1dc.jpg

Изменение: ok, поэтому я добавил или die(mysql_error()); к запросу, и я получил эту ошибку: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера MySQL, для правильного синтаксиса для использования рядом с "WHERE id =" 3029 "в строке 1. но на странице x200 есть почти такой же код (я еще не добавил к нему часть продажи), и он работает без ошибок. X200

<!--? require("Left.php"); ?--> <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 border="1"> <tbody><tr> <td> Fuel usage </td><td>70</td> </tr> </tbody></table> <table border="1"> <tbody><tr><td> Max gold per ton </td><td>5</td> </tr></tbody></table> <table border="1"> <tbody><tr><td> Price </td><td>1 point</td> </tr></tbody></table>
= 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 ответ

Проблема

Тот факт, что вы используете PHP booleans true/false для значения $ownerminer1000 и передаете их без кавычек в MySQL-запрос, вызывает небольшую проблему.

Когда PHP выдает логическое значение true для строки (как это должно быть в запросе), она заменяет строку 1. Ваш запрос на true работает, потому что он расширяется до:

SET ownminer1000=1 WHERE id='xxx'

Когда значение $ownerminer1000 является ложным, хотя PHP $ownerminer1000 false в пустую строку. В результате ваш запрос выглядит так:

SET ownminer1000= WHERE id='xxx'
---------------^^^

Этот материал подробно описан в правилах жонглирования в стиле PHP/знаменитого типа

Простейшее решение:

Это синтаксически недействительно. Если вы хотите продолжить использование логических переменных для этой переменной, вам нужно будет преобразовать их непосредственно перед передачей в 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 для разработчиков MySQL достаточно хорош и использует использование PDO в контексте старых функций mysql_*(). Самое главное - начать учиться использовать prepare()/execute(). Ваша проблема сегодня можно было бы избежать, если подготовить инструкцию с привязанным значением-заполнителем вместо булевой переменной.

licensed under cc by-sa 3.0 with attribution.