Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyciąganie nazwy tabeli
Forum PHP.pl > Forum > Bazy danych > MySQL
deha21
Jakiś czas temu pisałem o wyszukiwarce i chciałem tam zadać pytanie ale dodając posta wyskakuje mi komunikat, że wystapiły następujące błędy: i w tym miejscu nie ma żadnego tekstu winksmiley.jpg
Dlatego piszę tu, chodzi o wyciągnięcie nazwy tabeli. Mam taki kod:
  1. $result=mysql_query("SELECT id, title, textlead FROM news WHERE MATCH(title, tag, textcontent) AGAINST('$s' IN BOOLEAN MODE) UNION SELECT id, title, textlead FROM articles WHERE MATCH(title, tag, textcontent) AGAINST('$s' IN BOOLEAN MODE)");
  2. while($row=mysql_fetch_array($result)) {
  3.  
  4. $polskie=str_replace($pattFrom,$pattTo,$row['title']);
  5. $space=strtr($polskie," -?!:()@$%.,", "--__________");
  6.  
  7. $type=mysql_field_table($result);
  8. echo "<div class='result'><a href='$type,".$row['id'].",".strtolower($space).".html' title='".$row['title']."'><b>".stripslashes($row['title'])."</b></a>
  9. <p>".$row['textlead']."</p></div>";
  10. }

Prawie działa winksmiley.jpg Wyszukuje ale potrzebuję wyciągnąć nazwę tabeli z którego pobierany jest rekord, po to żeby wpisać odpowiedni link. Podobno robi to funkacja mysql_field_table ale zastosowałem ją i niestety wypluwa błąd - Wrong parameter count for mysql_field_table().To pewnie przez to, ze wyniki pobierane są z dwóch tabel... chociaż swoją drogą po co potrzebna byłby ta funkcja dla zapytania z jedną tabelą winksmiley.jpg
Proszę o pomoc.
Mchl
Cytat(deha21 @ 16.02.2010, 16:20:50 ) *
Podobno robi to funkacja mysql_field_table ale zastosowałem ją i niestety wypluwa błąd - Wrong parameter count for mysql_field_table().To pewnie przez to, ze wyniki pobierane są z dwóch tabel...


Raczej dlatego, że nie przeczytałeś jakie parametry trzeba podać tej funkcji:
http://pl.php.net/manual/en/function.mysql-field-table.php
deha21
Nie rozumiem na jakiej zasadzie to działa. Zrobiłem coś takiego (przykład z manuala) i nie działa:
  1. $result=mysql_query("SELECT id, title, textlead FROM news WHERE MATCH(title, tag, textcontent) AGAINST('$s' IN BOOLEAN MODE) UNION SELECT id, title, textlead FROM articles WHERE MATCH(title, tag, textcontent) AGAINST('$s' IN BOOLEAN MODE)");
  2. while($row=mysql_fetch_array($result)) {
  3.  
  4. $polskie=str_replace($pattFrom,$pattTo,$row['title']);
  5. $space=strtr($polskie," -?!:()@$%.,", "--__________");
  6.  
  7. for ($i = 0; $i < mysql_num_fields($result); ++$i) {
  8. $type=mysql_field_table($result,$i);
  9. }
  10.  
  11. echo "<div class='result'><a href='$field,".$row['id'].",".strtolower($space).".html' title='".stripslashes($row['title'])."'><b>".stripslashes($row['title'])."</b></a>
  12. <p>".$row['textlead']."</p></div>";
  13. }
Mchl
Po prostu, drugi parametr ma być numerem pola, które chcesz zbadać. Jeżeli robisz taką pętlę

Kod
for ($i = 0; $i < [url="http://www.php.net/mysql_num_fields"]mysql_num_fields[/url]($result); ++$i) {
$type=[url="http://www.php.net/mysql_field_table"]mysql_field_table[/url]($result,$i);
}


to w $type zawsze będziesz miał nazwę tabeli ostatniego pola.
deha21
Czyli np. jeśli pierwszym polem w tej tabeli jest pole o nazwie ID to wpisuje 1? Wpisywałem na sztywno ale też nie działało. Tutaj widzę pętle for, teraz jej używam ale zmienna $type jest pusta :/

Pomoże ktoś? Nie rozwiązałem problemu :/
Mchl
Prostszego przykłądu chyba nie da się zrobić:

Kod
<?php

mysql_connect('localhost','root','');
mysql_select_db('mysql');

$query = "SELECT db.user, user.user FROM db INNER JOIN user USING (user)";

$result = mysql_query($query);

echo mysql_field_table($result,0).PHP_EOL;
echo mysql_field_table($result,1).PHP_EOL;
deha21
Spoko funkcja działa ale nie przy moim zapytaniu:
  1. $result=mysql_query("SELECT id, title, textlead FROM news WHERE MATCH(title, tag, textcontent) AGAINST('$s' IN BOOLEAN MODE) UNION SELECT id, title, textlead FROM articles WHERE MATCH(title, tag, textcontent) AGAINST('$s' IN BOOLEAN MODE)");

Bo jak wpisałem same:
  1. $result=mysql_query("SELECT id, title, textlead FROM news");

To działa.

Potrzebne mi jest to do wyszukwiarki która szuka w tabelach news i arcticles. Nazwę tabeli muszę wiedzieć po to żeby wygenerować odpowiedni link.
Mchl
No to zróbmy to inaczej:

Kod
SELECT 'news' AS tableName, id, title, textlead FROM news
  WHERE MATCH(title, tag, textcontent) AGAINST('$s' IN BOOLEAN MODE)
UNION
SELECT 'articles' AS tableName, id, title, textlead FROM articles
  WHERE MATCH(title, tag, textcontent) AGAINST('$s' IN BOOLEAN MODE)


Heh... dopiero teraz zauważyłem, że to unia dwóch zapytań. Nic dziwnego że funkcja nie działa, bo nie ma sensu.
deha21
Chyba jestem za tępy na to :/ Wkleję jeszcze raz cały kod który teraz mam.
  1. $result=mysql_query("SELECT 'news' AS tableName, id, title, textlead FROM news WHERE MATCH(title, tag, textcontent) AGAINST('$s' IN BOOLEAN MODE) UNION SELECT 'articles' AS tableName, id, title, textlead FROM articles WHERE MATCH(title, tag, textcontent) AGAINST('$s' IN BOOLEAN MODE)");
  2.  
  3. while($row=mysql_fetch_array($result)) {
  4.  
  5. $polskie=str_replace($pattFrom,$pattTo,$row['title']);
  6. $space=strtr($polskie," -?!:()@$%.,", "--__________");
  7.  
  8. $type=mysql_field_table($result, 'id');
  9. echo $type;
  10.  
  11. echo "<div class='result'><a href='".$type.",".$row['id'].",".strtolower($space).".html' title='".stripslashes($row['title'])."'><b>".stripslashes($row['title'])."</b></a>
  12. <p>".$row['textlead']."</p></div>";
  13. }

Znów $type (czyli domniemana nazwa tabeli) jest pusta.
Mchl
Bo teraz już bez tej funkcji sobie poradzisz. Nazwę tabeli masz po prostu w polu 'tableName'

Kod
echo "<div class='result'><a href='".$row['tableName'].",".$row['id'].",".strtolower($space).".html' title='".stripslashes($row['title'])."'><b>".stripslashes($row['title'])."</b></a>

deha21
Dzięki działa. Teraz potrzebuję tylko zrobić żeby wyniki sortowało po trafności - podobno coś takiego jest możliwe w full text search. Bo teraz wyświetla mi od najniższego ID do najwyższego, przy czym tabela 'news' ma pierwszeństwo przed 'articles'.
Mchl
Kod
(SELECT 'news' AS tableName, id, title, textlead, MATCH(title, tag, textcontent) AGAINST('$s' IN BOOLEAN MODE) AS score FROM news
  WHERE MATCH(title, tag, textcontent) AGAINST('$s' IN BOOLEAN MODE))
UNION
(SELECT 'articles' AS tableName, id, title, textlead, MATCH(title, tag, textcontent) AGAINST('$s' IN BOOLEAN MODE) AS score FROM articles
  WHERE MATCH(title, tag, textcontent) AGAINST('$s' IN BOOLEAN MODE))
ORDER BY score DESC
deha21
Nie wiem czy to coś działa. Dalej tabela news ma pierwszeństwo przed articles a wyniki zwracane są od najstarszych do najnowszych. Czyli w sumie tak jak było.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.