Друзья! Граждане! Братья по php! Помогите справиться с ошибкой - из-за нее естественно не работает сайт. На старом php5.2 работает - на новом нет. Проблема в & Не могу понять как исправить. Вот код PHP: <?php error_reporting( E_ERROR ); function isStoreLink($link){ return (strstr($link, 'store/') !== FALSE); } function getNewLink($url, $cats, $prods){ $urlParts = explode('/', $url); foreach ($urlParts as $k => $part){ if(is_numeric($part)) { $urlParts[$k] = $cats[$part]; } if( strstr($part, '?pos=') ) { $pos = explode('=', $part); $urlParts[$k] = $prods[$pos[1]]; } } return implode('/',$urlParts); } function callback($buffer) { preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+". "(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/", $buffer, &$matches); $links = $matches[1]; // file_put_contents('processed.txt', var_export($links, true)); $storeLinks = array(); foreach ($links as $link){ if( isStoreLink($link) ) array_push($storeLinks, $link); } $replaces = array(); $categoryIDS = array(); $productIDS = array(); foreach ($storeLinks as $k => $link) { $parts = explode('/', $link); foreach($parts as $part) { if(is_numeric($part)) { array_push($categoryIDS, $part); }elseif( strpos($part, '?pos=') !== false ){ array_push($productIDS, str_replace('?pos=', '', $part)); } } } $mysqli = new mysqli('localhost', '', '', ''); if ($mysqli->connect_error) { die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error); } $catStmt = $mysqli->query("SELECT id, url FROM `eshop_cats` WHERE id IN(".implode(',', $categoryIDS).")"); $categoryUrlParts = array(); while($u = mysqli_fetch_assoc($catStmt)){ $categoryUrlParts[$u['id']] = $u['url']; } $prodStmt = $mysqli->query("SELECT id, url FROM `eshop_pos` WHERE id IN(".implode(',', $productIDS).")"); $productUrlParts = array(); while($u = mysqli_fetch_assoc($prodStmt)){ $productUrlParts[$u['id']] = $u['url']; } foreach ($storeLinks as $link){ if( strstr($link, '?pos=') ) { $p = explode('/', $link); $numVals = array(); foreach($p as $k => $l){ if(is_numeric($l)) array_push($numVals, $k); } for($i=1; $i<count($numVals); $i++){ unset($p[$numVals[$i]]); } $prodLink = implode('/',$p); $replaces[$link] = getNewLink($prodLink, $categoryUrlParts, $productUrlParts); }else{ $replaces[$link] = getNewLink($link, $categoryUrlParts, $productUrlParts); } // If is product delete all categories excluded first like this if(strpos($link, 'pos')){$link = ...} } //file_put_contents('processed.txt', $buffer); foreach($replaces as $link => $replace){ if($replace{strlen($replace)-1} !== '/') $replace.='/'; $buffer = str_replace('"'.$link.'"', '"'.$replace.'"', $buffer); } // $buffer = str_replace(array_keys($replaces), array_values($replaces), $buffer); //file_put_contents('processed.txt', var_export($replaces, true)."\r\n".'---------------------------'."\r\n", FILE_APPEND); //file_put_contents('processed.txt', $buffer, FILE_APPEND); return $buffer; } $mysqli = new mysqli('localhost', '', '', ''); if ($mysqli->connect_error) { die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error); } function BuildProductString($url, $mysql) { $query = $mysql->query("SELECT id, eshopcatid FROM `eshop_pos` WHERE `url`='".$url."' LIMIT 0,1"); $res = $query->fetch_assoc(); $uri = catsUpTree($res['eshopcatid'], $mysql); $uri = explode('/', $uri); $uri = array_reverse($uri); unset($uri[array_search(13480, $uri)]); $uri = implode('/', $uri); $uri .='?pos='.$res['id']; $uri = '/'.$uri; return $uri; } function catsUpTree($id, $mysql) { $cats = '/'.$id; $query = $mysql->query("SELECT parent_id FROM `eshop_cats` WHERE `id`='".(int)$id."' LIMIT 0,1"); $cat = $query->fetch_assoc(); if($cat['parent_id'] > 0) $cats.=catsUpTree($cat['parent_id'], $mysql); return $cats; } function getUrlToID($urls, $mysqli) { $IN = array(); foreach($urls as $u){ $IN[] = "'".$u."'"; } $INc = $IN; $pid = array(13480); $ids = $mysqli->query("SELECT id FROM eshop_cats WHERE url IN(".implode(',', $INc).")"); while ($s = mysqli_fetch_assoc($ids)){ array_push($pid, $s['id']); } $queryCategory = $mysqli->query("SELECT url, id FROM `eshop_cats` WHERE url IN(".implode(',', $IN).") AND active=1 AND parent_id IN(".implode(',', $pid).")"); // echo "SELECT url, id FROM `eshop_cats` WHERE url IN(".implode(',', $IN).") AND active=1 AND parent_id IN(".implode(',', $pid).")"; $queryProducts = $mysqli->query("SELECT url, id FROM `eshop_pos` WHERE url IN(".implode(',', $IN).")"); $categories = array(); $products = array(); if($queryCategory){ while ($q = mysqli_fetch_assoc($queryCategory)){ $categories[$q['url']] = $q['id']; } } if($queryProducts) { while($q = mysqli_fetch_assoc($queryProducts)){ $products[$q['url']] = $q['id']; } } $parent_id=13480; foreach($urls as $u) { $query = $mysqli->query("SELECT id, parent_id FROM eshop_cats WHERE parent_id=".$parent_id." AND url='".$u."'"); while ($row = mysqli_fetch_assoc($query)) { $categories[$u]=$row['id']; $parent_id=$row['id'];} } return array('c' => $categories, 'p' => $products); } function isOldUrl($data, $mysql) { $key = array_search('store', $data); if(isset($data[$key+1]) && is_numeric($data[$key+1])) { if(strstr($_SERVER['REQUEST_URI'], '?pos=')){ $first = true; foreach($data as $k => $d){ if( is_numeric($d) && $d && $first){ $first = false; }elseif(is_numeric($d) && !$first){ unset($data[$k]); } } } $url = '/store'; $categoryIDS = array(); $productID = false; foreach ($data as $u) { if (!strstr($u, 'store') && $u) { if (strstr($u, '?pos=')) { // IS Product $dataPart = explode('?pos=', $u); $productID = isset($dataPart[1]) ? $dataPart[1] : false; } else { // IS category array_push($categoryIDS, $u); // echo $u; } } } if(count($categoryIDS)){ $query = $mysql->query("SELECT id, url FROM `eshop_cats` WHERE id IN(".implode(',', $categoryIDS).")"); while ($q = mysqli_fetch_assoc($query)){ $url .='/'.$q['url']; } } if($productID){ $query = $mysql->query("SELECT id, url FROM `eshop_pos` WHERE id =".(int)$productID." LIMIT 0,1"); $q = mysqli_fetch_assoc($query); $url .='/'.$q['url'].'/'; }else{ $url .='/'; } # var_dump($url);die(); header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$url);exit(); } } if(strstr($_SERVER['REQUEST_URI'], 'store/')) { $request_uri = $_SERVER['REQUEST_URI']; $page = FALSE; $show_by = FALSE; if (strstr($request_uri, '?search=')) { $request_part = explode('?search=', $request_uri); $request_uri = $request_part[0]; $search = $request_part[1]; $search = str_replace("/","",$search); } if (strstr($request_uri, '?ymclid=')) { $request_part = explode('?ymclid=', $request_uri); $request_uri = $request_part[0]; $ymclid = $request_part[1]; } if (strstr($request_uri, '?gclid=')) { $request_part = explode('?gclid=', $request_uri); $request_uri = $request_part[0]; $gclid = $request_part[1]; } if (strstr($request_uri, '?page=')) { $request_part = explode('?page=', $request_uri); $request_uri = $request_part[0]; $page = $request_part[1]; } if (strstr($request_uri, '?show_by=')) { $request_part = explode('?show_by=', $request_uri); $request_uri = $request_part[0]; $show_by = $request_part[1]; } $data = explode('/', $request_uri); // echo $request_uri; isOldUrl($data, $mysqli); $find = array(); $oldUrl = FALSE; foreach ($data as $k => $v) { if ($v !== 'store' && $v) { array_push($find, $v);$oldUrl=false; } } $dbData = getUrlToID($find, $mysqli); $uri = '/store'; foreach ($find as $k => $v) { if (isset($dbData['c'][$v]) && $dbData['c'][$v]) { $uri .= '/' . $dbData['c'][$v]; } elseif (isset($dbData['p'][$v]) && $dbData['p'][$v] && $k === count($find) - 1) { // 404 $ch = explode('/', $_SERVER['REQUEST_URI']); $realParts = 0; foreach ($ch as $cc){ if($cc !=='store' && $cc){ $realParts++; } } if($realParts > 2 && !$ymclid && !$gclid){ $uri = '404'; }else{ $uri = '/store' . BuildProductString($v, $mysqli); } break; } else { $uri .= 'false'; } } //echo $uri; if ($page) $uri .= '?page=' . $page; if ($show_by) $uri .= '?show_by=' . $show_by; if ($ymclid) $uri .= '?ymclid=' . $ymclid; if ($gclid) $uri .= '?gclid=' . $gclid; if ($search) $uri .= '?search=' . $search; // echo $uri; $_SERVER['REQUEST_URI'] = $uri; // echo $uri; } И если можно, поясните, что поправить, чтобы я мог передавать get переменные, чтобы работала метрика от Яндекса. Спасибо. Низкий поклон всем откликнувшимся.
Естественно. Ведь это компонент URL валидный. Чтобы все работало, кодируйте данные, передаваемые в запросе. --- Добавлено --- А если & должно быть? Тогда что делать бы стал? Проблемы решать надо, а не игнорировать.
согласен. не помню подробностей. Помню, что нагуглил, что это устаревший кусок и его надо удалить. Удалил и заработало. Это был старый движок, и его надо было запустить на время. Так что задача была решена.
Прочитал внимательнее вопрос, тьфу, там совсем про другое же. Про ссылочные обращения. пардон, устал. Таки да, просто убирайте амперсанды. --- Добавлено --- https://stackoverflow.com/questions/8971261/php-5-4-call-time-pass-by-reference-easy-fix-available
@boomer546 убирай амперсанды в обращении к функции. они могут быть только в описании самой функции, этого достаточно для передачи по ссылке.