имеет ли смысл такой код или это вообще нереально сделать так , не до конца понимаю природу запросов в Mysql PHP: function search($pattern){ $mysqli = new mysqli ("localhost", "root", "", "dbname"); if ($mysqli->connect_errno) { printf("Не удалось подключиться: %s\n", $mysqli->connect_error); exit(); } $query = "SELECT * FROM dbname.template"; $result = mysqli_query($mysqli,$query); while($row = mysqli_fetch_assoc($result)){ if(preg_match("/$pattern/", $row['title']) or preg_match("/$pattern/", $row['content'])){ $query2 = "SELECT * FROM dbname.content"; $result2 = mysqli_query($mysqli,$query2); while($row2 = mysqli_fetch_assoc($result2)){ if($row['title'] == $row2['title']){ $updateResultContent = " UPDATE `dbname`.`content` SET `title` = ".$row['title'].", `pubDate` = ".$row['pubDate'].", `content` = ".$row['content']." "; $mysqli->query ($updateResultContent); } else { $resultContent = "INSERT INTO `dbname`.`content` (`id`, `title`, `pubDate`, `content`) VALUES (NULL,'".$row['title']."','".$row['pubDate']."','".$row['content']."')"; $mysqli->query ($resultContent); } } } } $mysqli->close(); }
Конкретно проблема в том что я не могу понять вот есть у меня цикл Код (Text): while($row = mysqli_fetch_assoc($result)) достает 1 поле с бд в виде ассоциативного массива проверяет на соответствие , если находит , идет цикл Код (Text): while($row2 = mysqli_fetch_assoc($result2)){ который тоже достает 1 поле в виде ассоциативного массива проверяет равно ли значение с ключом 'title' массива $row значению с ключом 'title' массива $row2 (сразу первый вопрос можно ли так сравнивать как это сделал я Код (Text): if($row['title'] == $row2['title']) если нет то как правильно подскажите( и да тип данных там string)) , и если сходиться то он просто перезаписывает значения полей PHP: $updateResultContent = " UPDATE `dbname`.`content` SET `title` = ".$row['title'].", `pubDate` = ".$row['pubDate'].", `content` = ".$row['content']." "; $mysqli->query ($updateResultContent); а если нет то просто идет дальше и забрасывает в новою таблицу таблицу то что соответствует первому сравнению. Вопрос №2 Если методом mysqli_fetch_assoc начинать доставать поля с пустой таблицы что тогда происходит ? оно просто возвращает 0 и все код идет дальше ? Вопрос №3 Надо ли заново коннектица к бд во втором цикле while? Вопрос №4 могут ли вообще одновременно перебираться 2 таблицы бд таким образом как я представил , если нет то каким может Вопрос №5 Вообще я хочу избежать повторений во второй таблице то есть "content" и решил сделать таким хоть и туповатым способом, также принял бы ваше видение решение проблемы. P.S. В моем коде возможны даже самые детские ошибки , заранее извиняюсь
Во-первых, никакие сравнения не идут. Оператор "=" это оператор присвоения, а не сравнения. Эта конструкция работает по такой логике: 1) У нас есть while. В его условии должно быть лино true либо false. 2) В этом самом условии мы забираем из очереди строку. И тут же присваиваем ее некоей переменной $row, чтобы она не "в воздух" отдалась. 3) Так как while ждет от нас тип bool, полученное значение принудительно кастится к нему. 4) Если строка существует, то конвертируется в true, и цикл отрабатывает. Если выбрали все строки, то функция вернет false. Все, цикл оборвался. Вот и вся магия. Просто вытаскиваем строки по одной, пока не кончатся.