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.