brodyaga, отвечаю — я модератор, и мне неосознанно захотелось. Но не будем уходить от основной темы. Для решения какой задачи требуется амперсанд? И как он работает? Вы в состоянии обьяснить? Если вы объясните это, я признаю, что я отделив ваши сообщения я был неправ.
....я пойду узнаю... что же это такое, и зачем оно нужно. Хорошо, будет вашим домашним заданием. С работы приду — проверю.
дадим ему полчаса? Но вообще-то, лично меня интересует принцип работы функции quoteStr() как-то он от меня ускользает, я бы сказал =)
Чебурген, прочитал. Смеялсо =))) По принципу, давайте сначала все поломаем, и сделаем заново... )) Кстати, а если я и правда захочу вставить в текст \\" ? Видимо, прийдется экранировать данную комбинацию? =)
PHP: <?php // <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> // define('ENGINE_DATABASE_HOST', 'localhost'); define('ENGINE_DATABASE_NAME', 'test'); define('ENGINE_DATABASE_UNAME', 'test'); define('ENGINE_DATABASE_PASS', 'test'); define('ENGINE_PREFIX', 'www'); class ClassFunctions{ function StripSlashes($text) { if (get_magic_quotes_gpc()) { $text = stripslashes($text); } return $text; } } $functions = new ClassFunctions; class ClassDataBase{ function ClassDataBase($sqlserver, $sqluser, $sqlpassword, $database){ $this->user = $sqluser; $this->password = $sqlpassword; $this->server = $sqlserver; $this->dbname = $database; $this->prefix = ENGINE_PREFIX; $this->sql_сonnect(); } function prefix($table){ if($this->prefix != ""){ return $this->prefix."_".$table; }else{ return $table; } } function sql_сonnect() { $this->db_connect_id = @mysql_connect($this->server, $this->user, $this->password); if($this->db_connect_id){ if($this->dbname != ""){ $dbselect = mysql_select_db($this->dbname); if(!$dbselect){ $this->db_connect_id = $dbselect; return false; } } return $this->db_connect_id; }else{ return false; } } function quoteString($str){ $str = "'".str_replace('\\"', '"', addslashes($str))."'"; return $str; } } $database = new ClassDataBase( ENGINE_DATABASE_HOST, ENGINE_DATABASE_UNAME, ENGINE_DATABASE_PASS, ENGINE_DATABASE_NAME); $path = isset($_GET['path']) ? $functions->StripSlashes($_GET['path']) : "c:\\test"; $sql = sprintf("SELECT path FROM %s WHERE path LIKE %s",$database->prefix("table"),$database->quoteString(addslashes($path)."%")); echo $sql; // Выводит на экран // SELECT path FROM www_table WHERE path LIKE 'c:\\\\test%' // ПРОВЕРИЛ ?>
PHP: <?php $sql = sprintf("SELECT path FROM %s WHERE path = %s",$database->prefix("table"),$database->quoteString($path)); //SELECT path FROM www_table WHERE path = 'c:\\test' //Проверил ?>
Товарищ не смог доказать свою вменяемость. Я буду за вами наблюдать, дабы вы не навредили неокрепшим умам. Чистить глупости буду без предупреждений.
brodyaga Вот тебе перемеменная $s="\x00\x22\x74\x65\x73\x74\x22\x00"; запиши её в базу, а потом попробуй её же найти в базе с помощью LIKE
В общем, пример этот, конечно, высосан из пальца. Но написал я его для того, чтобы показать тебе наглядно (по-другому ты не понимаешь), что твой способ работы с запросами имеет очень большие расхождения с МАНУАЛОМ. как в части удивительной функции quotestring, так и в части подготовки выражения для LIKE.
Код (Text): $var = "\x00\x22\x74\x65\x73\x74\x22\x00"; $sql = sprintf("INSERT INTO %s (path) VALUES (%s)",$database->prefix("table"),$database->quoteString($var)); $sql = sprintf("SELECT path FROM %s WHERE path LIKE %s",$database->prefix("table"),$database->quoteString($var."%")); В базе "test"
второй запрос возвращает 0 строк. я проверял. Тебе привести здесь test case, чтобы все могли убедиться?
Проверьте еще раз – у меня все работает Второй запрос выводит SELECT path FROM www_table WHERE path LIKE '\0"test"\0%' quoteString() или quoteString(addslashes()) От ситуации.
Должен отметить, кстати, что лично для меня понимание принципов экранирования данных в запросах вообще и для LIKE в частности, заняло довольно продолжительное время. Так что, я прекрасно понимаю, что у любого человека могут быть проблемы с этим вопросом.
Для администраторов – если Вы закрываете топик а потом его открываете убедительная просьба сообщать об этом авторам.
твоё маниакальное стремление перевести разговор из практической плоскости на оскорбление администрации форума вызывает во мне большие сомнения в том, что мне вообще следует тебе что-либо объяснять.
Полный текст кода для проверки Имеем: test – база данных www_test – таблица с полем path PHP: <?php // <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> // define('ENGINE_DATABASE_HOST', 'localhost'); define('ENGINE_DATABASE_NAME', 'test'); define('ENGINE_DATABASE_UNAME', 'test'); define('ENGINE_DATABASE_PASS', 'test'); define('ENGINE_PREFIX', 'www'); class ClassFunctions{ function StripSlashes($text) { if (get_magic_quotes_gpc()) { $text = stripslashes($text); } return $text; } } $functions = new ClassFunctions; class ClassDataBase{ function ClassDataBase($sqlserver, $sqluser, $sqlpassword, $database){ $this->user = $sqluser; $this->password = $sqlpassword; $this->server = $sqlserver; $this->dbname = $database; $this->prefix = ENGINE_PREFIX; $this->sql_сonnect(); } function prefix($table){ if($this->prefix != ""){ return $this->prefix."_".$table; }else{ return $table; } } function query($sql, $limit=0, $start=0){ if(!$this->db_connect_id) return false; mysql_select_db($this->dbname); if ( !empty($limit) ) { if (empty($start)) { $start = 0; } $sql = $sql. ' LIMIT '.(int)$start.', '.(int)$limit; } $result = mysql_query($sql, $this->db_connect_id); if ( $result ) { return $result; } else { $result = false; return $result; } } function sql_сonnect() { $this->db_connect_id = @mysql_connect($this->server, $this->user, $this->password); if($this->db_connect_id){ if($this->dbname != ""){ $dbselect = mysql_select_db($this->dbname); if(!$dbselect){ $this->db_connect_id = $dbselect; return false; } } return $this->db_connect_id; }else{ return false; } } function fetchArray($result){ return @mysql_fetch_assoc( $result ); } function quoteString($str){ $str = "'".str_replace('\\"', '"', addslashes($str))."'"; return $str; } } $database = new ClassDataBase( ENGINE_DATABASE_HOST, ENGINE_DATABASE_UNAME, ENGINE_DATABASE_PASS, ENGINE_DATABASE_NAME); $var = "\x00\x22\x74\x65\x73\x74\x22\x00"; $sql = sprintf("INSERT INTO %s (path) VALUES (%s)",$database->prefix("table"),$database->quoteString($var)); $database->query($sql); $sql = sprintf("SELECT path FROM %s WHERE path LIKE %s",$database->prefix("table"),$database->quoteString($var."%")); if (false != $result = $database->query($sql)) { $numrows = @mysql_num_rows($result); for($n=0;$n<$numrows;$n++) { if (false !=$f = $database->fetchArray( $result)){ echo $f['path']."<br>"; } } } ?> Данный код запишет переменную $var ("test")в БД и тут же произведет поиск
итак. что мы имеем. код с предыдущей страницы. два запроса (с предыдущей же страницы): PHP: #$sql = sprintf("INSERT INTO test (ttt) VALUES (%s)",$database->quoteString($var)); $sql = sprintf("SELECT ttt FROM test WHERE ttt LIKE %s",$database->quoteString(addslashes($var)."%")); echo $sql."<br>"; $res=mysql_query($sql) or die($sql."<br>".mysql_error()); echo mysql_num_rows($res); Закомментированный запрос вставляет данные, второй - запрашивает.ю у меня возвращает 0 записей.