2013-06-27 3 views
0

Пожалуйста, объясните, почему я не могу получить переменный сеанс для «пистолета», чтобы установить или $ _SESSION [ «сообщил»], но он отлично работает для «Винтовки»PHP условные StrPos проверить косяк набор переменного сеанса

формы ЧТО ПОСТЫ ДАННЫЕ

<form name="<?=$prodadd?>" id="<?=$prodadd?>" method="post" action="process.php"> 
<input type="hidden" name="formid" value="addtocart" /> 
<!-- other input fields here --> 
<input type="hidden" name="type" value="<?=$row['Type']?>" /> 
<input type="hidden" name="weight" value="<?=$row['Weight']?>" /> 
<!-- other input fields here --> 
</form> 

ПРОСТОЙ ЗАЕЗД process.php УСТАНОВКА SESSION Variable:

if (strpos($_POST[type],"Pistol")) { 
session_start(); 
$_SESSION['pwght'] = $_SESSION['pwght'] + $_POST['weight']; 
session_write_close();} 

else if (strpos($_POST[type],"Rifle")) { 
session_start(); 
$_SESSION['rwght'] = $_SESSION['rwght'] + $_POST['weight']; 
session_write_close();} 

$_SESSION['reported'] = $_POST['weight']; 

, что я делал и ПРОБОВАЛИ:

Я посмотрел в базе данных после того, как элемент стрелковой и элемент Пистолет был послан через форму. Помимо обычных различий в продуктах, они одинаковы. Я проверил и проверил, что в обоих случаях данные записываются в базу данных и не пусты или отсутствуют. Я изменил порядок, в котором if/else if выполняется с одинаковыми результатами. Я изменил имя имен сеансов без изменения проблемы. Независимо от того, что я делаю, я не могу получить его, чтобы установить $ _SESSION [ 'pwght'] или $ _SESSION [ 'сообщили']

+0

Что произойдет, если вы изменяете все эти 'если (StrPos ($ _ POST [тип] "строка"))' 'ы в 'если (StrPos ($ _ POST [Тип]» строка ")! == FALSE)' s '? (Примечание: если 'type' не является определенной константой, вы, вероятно, должны использовать' $ _POST ['type'] ', хотя это не проблема. – Wrikken

+0

@Wrikken, похоже, исправил его, но я не знайте почему. (Как побочная заметка у меня было это как '$ _POST ['xxx']' до этого без изменений, я только недавно взял одинарные кавычки как попытку попробовать что-нибудь исправить.) - Можете ли вы объяснить, почему используя функцию true/False check, но другой метод не подходит? – DMSJax

+1

Если вы посмотрите на руководство для ['strpos'] (http://www.php.net/strpos), есть большой красный квадрат, объясняющий, почему, и это помогает узнать о [type juggling] (http://php.net/manual/en/language.types.type-juggling.php): позиция подстроки в строке возвращается, если позиция находится в _the самый первый символ_, эта позиция - '0'. Голый' 0' оценивается как false. Таким образом, разница между выводами strpos() составляет '0' или' false'. Сопоставления типов ('=== '&'! == ') не только сравнивают« правду »или« ложь », значения, но проверьте, являются ли левые и правые выражения одинаковыми _type_. – Wrikken

ответ

1

От the manual for strpos

Предупреждение

Эта функция может возвращать ЛогическоеFALSE, но может также возвращать не-булево значение в которое приводится к FALSE . Пожалуйста, прочитайте section on Booleans для получения дополнительной информации. Используйте the === operator для проверки возвращаемого значения этой функции.

Другими словами, вы хотите проверить, возвращает ли он логическоеложные, но нет ничего другого, что бы evaluate to false when cast to boolean (в данном случае 0, он соответствует на самом первом символе). Это делается с помощью:

if(strpos($haystack,$needle)!==false)