PHP заставляет переменную иметь определенный тип - PullRequest
2 голосов
/ 04 мая 2011

Это может быть глупый вопрос, но я мог бы также ответить на него:)

есть ли сила, чтобы заставить

$tel1 = '05';// string
settype($tel1,'string');
$tel1 = 06;//either throw error, or convert it to string automatically.
var_dump($tel1);//(string [2]) 05

Приведенный выше код имеет макушку моей головы, поэтому не можетбыть точным, но мне нужно сохранить переменную в виде строки, а не числовой, потому что из-за какой-то глупости, которую я сделал, теперь мои номера телефонов теряют первые 0: - (

n Я не могу переписать ее, потому что онабудет путаться с другими числовыми типами, b4 вы спрашиваете, что это была автоматизированная служба для БД, чтобы проверить, было ли это числовое значение или нет,

ОБНОВЛЕНИЕ Это проблема

function escape($str){
   if(is_numeric($str)){
       return $str;
   }else{
       return "'".mysql_real_escape_string($str).'\'';
   }
}
$tel1 = "06";
$sql = 'SELECT * FROM blabla WHERE id = '.escape($tel1).'';
//above is same as below
$sql = 'SELECT * FROM blabla WHERE id = 06 ';

IЯ не могу ничего изменить внутри функции scape, потому что другие функции, используемые на веб-сайте, используют эту функцию, я не хочу испортить их проверки.

Ответы [ 6 ]

1 голос
/ 04 мая 2011

Вы используете is_numeric для проверки числового содержимого, а не целочисленного типа. Но затем вы берете переменную с именем $str, которая подразумевает, что вы хотите , чтобы она была строкой.

Возможно использование:

function escape($val) {
   if (is_numeric($val) && !is_string($val)) {
       return $val;
   }
   else{
       return "'" . mysql_real_escape_string($val) . '\'';
   }
}

Теперь строки будут экранированы и заключены в кавычки, но не , если они содержат только числовое содержимое.

1 голос
/ 04 мая 2011

Вы не можете принудительно заставить переменную определенного типа в глобальной области видимости.

Вы можете использовать Array s и Object s в функции.

function getElementsByClassName(DOMNode $parentElement, Array $classNames) {
 ... 
}

Если вы передадите объект, который не является экземпляром DOMNode (или подклассом), или если вы не передадите Array в качестве второго аргумента, вы получите ошибку.

Выконечно, может приводить любую переменную, например, (string) $tel1.

Вы не должны обрабатывать телефонные номера как Int s, так как ведущие нули и возможные скобки и тире.Кроме того, как только ваш номер телефона будет Int, он больше не будет знать о заполнении 0, потому что он будет отброшен, так что при его повторном наборе вы не получите исходный String.

1 голос
/ 04 мая 2011

вы можете сделать что-то вроде:

$string = (string) $int;

или использовать функцию

$string = strval($int);
0 голосов
/ 04 мая 2011

Как сказал Алекс, для начала убедитесь, что телефонный номер никогда не преобразуется из строки в int в вашем собственном коде.Затем вам нужно убедиться, что он не будет преобразован при отправке в вашу базу данных SQL.Это должно работать, если вы делаете это так:

$sql = "SELECT * FROM blabla WHERE id = '" . mysql_real_escape_string($tel1) . "'";

Это то же самое, что

$sql = "SELECT * FROM blabla WHERE id = '06'";
0 голосов
/ 04 мая 2011

Если вы объявите переменную как:

$var = 06;

оно сразу становится 6 без начального нуля, потому что ведущий ноль, когда дело доходит до целых чисел, не имеет смысла, и поэтому он исключен.

Другими словами, ваша переменная должна быть создана в виде строки, что вы, вероятно, и вывели сами.

Быстрое исправление будет следующим: вы можете добавить другой параметр к вашей функции escape ().

Например:

function escape($str, $force_str = false)
{
    if($force_str) 
    { 
        // do your conversion, the rest of the site will by default pass false so nothing will be broken 
    }
}
0 голосов
/ 04 мая 2011

Чтобы привести переменную, вы можете использовать что-то вроде:

$i = 1;
$s = (string) $i;

В зависимости от адаптера БД вы не сможете обнаружить тип, возвращаемый из базы данных.Я считаю, что это PDO, который возвращает все (даже значения INT) в виде строк.

Функция number_format() может быть полезна и вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...