Juist weergeven Solr query met PHP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Joris R

Joris R

18/10/2020 18:17:06
Quote Anchor link
Hallo allemaal, ik ben nog redelijk nieuw met PHP en ik loop tegen een probleem aan. Wanneer ik data van Apache Solr aanvraag lukt het mij niet om dit uit de juiste manier weer te geven (en ik heb geen idee hoe ik dit moet doen). Dit is de code waar het om zou moeten gaan (mijn pagination code is volgensmij niet nodig):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
$core_url = "http://localhost:8983/solr/[corename]/select?q=";
$start=$page*10-10;

$contents = file_get_contents($core_url.'Keywords:'.$query.'&wt=php&rows=10&start='.$start.'&fl=Journal_title,Publisher,Keywords,Journal_URL,Full_text_formats,Full_text_language,Most_Recent_Article_Added,Number_of_Article_Records'.'');
eval("\$result = " . $contents . ";");
$count = $result["response"]["numFound"];
$numOfPages = ceil($count/10);

if($count==0){
    echo "no results found";
}

for($i=0; $i<sizeof($result["response"]["docs"]) ; $i++){
    echo '<div class="searchresult">';
    foreach($result["response"]["docs"][$i] as $key=>$value){
        display($key,$value);
    }
    echo '</div>';
    echo "<br/>";
}


function display($k,$x){
    if(!isset($x)){
        return;
    }
    echo $k.": ";
    if(!is_array($x)){
        echo $x;

        echo "<br>";
    }
    else {
        for($i=0; $i<sizeof($x) ; $i++){
            if(sizeof($x)==1 || $i==sizeof($x)-1){
                echo $x[$i];
            }
            else {
                echo $x[$i].' - ';
            }
        }
        echo "<br>";
    }
}

?>



Dit geeft mij het volgende resultaat: https://i.stack.imgur.com/d8pih.jpg
En ik wil uiteindelijk het volgende bereiken: https://i.stack.imgur.com/p1LI7.jpg

Ik hoop dat ik genoeg informatie heb gestuurd en dat iemand mij hiermee uit de brand kan helpen. Mocht dit niet (duidelijk) genoeg zijn dan stuur ik graag extra informatie.

Alvast bedankt voor het meedenken! :)

Toevoeging op 18/10/2020 18:24:38:

Tevens begrijp ik dat de opmaak in css gedaan moet worden, dit zou (hopelijk) geen probleem moeten zijn. Wat ik voornamelijk lastig vind is hoe ik de tekst op deze manier in de div kan plaatsen op volgorde met apart id/class voor latere css, of bijvoorbeeld een <h1> <h2> <h3> tag of iets in die richting.

Hopelijk maakt dit het iets duidelijker!
Gewijzigd op 18/10/2020 18:35:10 door Joris R
 
PHP hulp

PHP hulp

28/10/2020 06:26:05
 
- Ariën -
Beheerder

- Ariën -

18/10/2020 18:27:31
Quote Anchor link
Zou je jouw code tussen code-tags willen zetten? Quote is hier niet voor bedoeld.
 
Joris R

Joris R

18/10/2020 18:34:16
Quote Anchor link
- Ariën - op 18/10/2020 18:27:31:
Zou je jouw code tussen code-tags willen zetten? Quote is hier niet voor bedoeld.

Excuus, ga ik doen! Zijn dat de drie ` tekens zoals bij stackoverflow? Ik zie het namelijk niet staan in het optiemenu...

Edit: gelukt!
Gewijzigd op 18/10/2020 18:35:25 door Joris R
 
- Ariën -
Beheerder

- Ariën -

18/10/2020 18:45:54
Quote Anchor link
$x is een array? Dan kan je die als test met print_r() zichtbaar maken zodat je weet welke elementen je kan gebruiken. Zoaks titel, formaat, type.
 
Joris R

Joris R

18/10/2020 19:24:34
Quote Anchor link
- Ariën - op 18/10/2020 18:45:54:
$x is een array? Dan kan je die als test met print_r() zichtbaar maken zodat je weet welke elementen je kan gebruiken. Zoaks titel, formaat, type.


Het is inderdaad een array. Maar wanneer ik dit doe:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$k.": ";
    if(!is_array($x)){
        print_r ($x);

        
        echo "<br>";
    }
    else {
        for($i=0; $i<sizeof($x) ; $i++){
            if(sizeof($x)==1 || $i==sizeof($x)-1){
                print_r ($x[$i]);
            }
            else {
                print_r ($x[$i]).' - ';
            }
        }
        echo "<br>";
    }
}

verandert er niets, of bedoelt u iets anders?
Gewijzigd op 18/10/2020 19:24:51 door Joris R
 
- Ariën -
Beheerder

- Ariën -

18/10/2020 19:43:39
Quote Anchor link
Haal die spatie in je functie eens weg.
 
Joris R

Joris R

18/10/2020 20:09:33
Quote Anchor link
Excuus, maar op deze manier krijg ik het ook niet aan de praat (of bedoelt u iets op een andere regel?).
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function display($k,$x){
    if(!isset($x)){
        return;
    }
    echo $k.": ";
    if(!is_array($x)){
        print_r($x);

        echo "<br>";
    }
    else {
        for($i=0; $i<sizeof($x) ; $i++){
            if(sizeof($x)==1 || $i==sizeof($x)-1){
                print_r($x[$i]);
            }
            else {
                print_r($x[$i]).' - ';
            }
        }
        echo "<br>";
    }
}
 
Rob Doemaarwat

Rob Doemaarwat

18/10/2020 20:11:22
Quote Anchor link
Volgens mij ben je op zoek naar zoiets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

$data
= $result["response"]["docs"][$i] + [ //defaults - indien nodig / niet altijd gevuld
  'Journal_title' => null,
  'Journal_URL' => null,
  'Publisher' => 'Unknown',
  'Keywords' => null,
  'Full_text_language' => 'Unknown',
  'Full_text_formats' => null
];

print("
  <h1>{$data['Journal_title']}</h1>
  <a href='{$data['Journal_URL']}'>{$data['Journal_URL']}</a>
  Publisher: {$data['Publisher']}<br>
  Keywords: {$data['Keywords']}<br>
  Language: {$data['Full_text_language']}<span>File type: {$data['Full_text_formats']}"

);

?>

Opmaken met CSS en via :empty evt lege velden verbergen.
 
Joris R

Joris R

18/10/2020 20:28:24
Quote Anchor link
Hoi Rob, heel erg bedankt voor uw hulp! Ik merk alleen wel dat u meer verstand heeft van PHP dan ik (gelukkig), en ik ben niet helemaal zeker welk deel ik moet aanpassen om uw code uit te proberen (ik ben nog heel slecht in de context oppakken van code). Ik heb mijn complete php code toegestuurd en hopelijk kunt u mij de zinnummers sturen waar ik mijn code kan vervangen door die van u.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?php
if(isset($_GET["page"])){
    $page = (int)$_GET["page"];
}

else {
    $page = 1;
}


$query = urldecode($_GET["query"]);
$query = str_replace(" ","%20",$query);

$core_url = "http://localhost:8983/solr/[core-name]/select?q=";
$start=$page*10-10;

$contents = file_get_contents($core_url.'Keywords:'.$query.'&wt=php&rows=10&start='.$start.'&fl=Journal_title,Publisher,Keywords,Journal_URL,Full_text_formats,Full_text_language,Most_Recent_Article_Added,Number_of_Article_Records'.'');
eval("\$result = " . $contents . ";");
$count = $result["response"]["numFound"];
$numOfPages = ceil($count/10);

if($count==0){
    echo "no results found";
}


for($i=0; $i<sizeof($result["response"]["docs"]) ; $i++){
    echo '<div class="searchresult">';
    foreach($result["response"]["docs"][$i] as $key=>$value){
        display($key,$value);
    }

    echo '</div>';
    echo "<br/>";
}


echo '<div class="pagination">';
$max = 5;
$startPage = max(1, $page - $max);
$firstPage = min(1, $numOfPages);
$lastPage = max(1, $numOfPages);
echo "<a href='search.php?page=".($firstPage)."&query=".$query."'>".($firstPage)."</a> ";
$endPage = min( $numOfPages, $page + $max);
for($i = $startPage; $i < $endPage; $i++) {
    echo '<div class="pageresult">';
    echo "<a href='search.php?page=".($i+1)."&query=".$query."'>".($i+1)."</a> ";
    echo '</div>';
}

echo " <a href='search.php?page=".($lastPage)."&query=".$query."'>".($lastPage)."</a> ";
echo "<br>";
echo "<br>";
echo "<br>";


echo '</div>';

function
display($k,$x){
    if(!isset($x)){
        return;
    }

    echo $k.": ";
    if(!is_array($x)){
        echo $x;

        
        echo "<br>";
    }

    else {
        for($i=0; $i<sizeof($x) ; $i++){
            if(sizeof($x)==1 || $i==sizeof($x)-1){
                echo $x[$i];
            }

            else {
                echo $x[$i].' - ';
            }
        }

        echo "<br>";
    }
}


?>
 
Rob Doemaarwat

Rob Doemaarwat

18/10/2020 20:40:46
Quote Anchor link
Mijn stukje vervangt jouw regel 26 t/m 28 (hierboven).
 
Joris R

Joris R

18/10/2020 20:59:34
Quote Anchor link
Rob Doemaarwat op 18/10/2020 20:40:46:
Mijn stukje vervangt jouw regel 26 t/m 28 (hierboven).


Bedankt voor uw snelle reactie! Ik heb het volgende (en wat andere pogingen) geprobeerd:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php
if(isset($_GET["page"])){
    $page = (int)$_GET["page"];
}

else {
    $page = 1;
}


$query = urldecode($_GET["query"]);
$query = str_replace(" ","%20",$query);

$core_url = "http://localhost:8983/solr/journals/select?q=";
$start=$page*10-10;

$contents = file_get_contents($core_url.'Keywords:'.$query.'&wt=php&rows=10&start='.$start.'&fl=Journal_title,Publisher,Keywords,Journal_URL,Full_text_formats,Full_text_language,Most_Recent_Article_Added,Number_of_Article_Records'.'');
eval("\$result = " . $contents . ";");
$count = $result["response"]["numFound"];
$numOfPages = ceil($count/10);

if($count==0){
    echo "no results found";
}


for($i=0; $i<sizeof($result["response"]["docs"]) ; $i++){
    echo '<div class="searchresult">';
    $data = $result["response"]["docs"][$i] + [ //defaults - indien nodig / niet altijd gevuld
        'Journal_title' => null,
        'Journal_URL' => null,
        'Publisher' => 'Unknown',
        'Keywords' => null,
        'Full_text_language' => 'Unknown',
        'Full_text_formats' => null
      ];
      
      print("
        <h1>{$data['Journal_title']}</h1>
        <a href='{$data['Journal_URL']}'>{$data['Journal_URL']}</a>
        Publisher: {$data['Publisher']}<br>
        Keywords: {$data['Keywords']}<br>
        Language: {$data['Full_text_language']}<span>File type: {$data['Full_text_formats']}"

      );
      
    echo '</div>';
    echo "<br/>";
}


echo '<div class="pagination">';
$max = 5;
$startPage = max(1, $page - $max);
$firstPage = min(1, $numOfPages);
$lastPage = max(1, $numOfPages);
echo "<a href='search.php?page=".($firstPage)."&query=".$query."'>".($firstPage)."</a> ";
$endPage = min( $numOfPages, $page + $max);
for($i = $startPage; $i < $endPage; $i++) {
    echo '<div class="pageresult">';
    echo "<a href='search.php?page=".($i+1)."&query=".$query."'>".($i+1)."</a> ";
    echo '</div>';
}

echo " <a href='search.php?page=".($lastPage)."&query=".$query."'>".($lastPage)."</a> ";
echo "<br>";
echo "<br>";
echo "<br>";


echo '</div>';

function
display($k,$x){
    if(!isset($x)){
        return;
    }

    echo $k.": ";
    if(!is_array($x)){
        echo $x;

        
        echo "<br>";
    }

    else {
        for($i=0; $i<sizeof($x) ; $i++){
            if(sizeof($x)==1 || $i==sizeof($x)-1){
                echo $x[$i];
            }

            else {
                echo $x[$i].' - ';
            }
        }

        echo "<br>";
    }
}


?>

Maar nu krijg ik de volgende error:
https://i.postimg.cc/XNtH9WYL/image-2.jpg
Bij de volgende aangegeven regels:
https://i.postimg.cc/ZYWs9n40/image-3.jpg
 
Rob Doemaarwat

Rob Doemaarwat

18/10/2020 21:13:40
Quote Anchor link
Ah, op die fiets. Voeg dan op regel 64 toe/in:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

foreach($data as $key => $value) if(is_array($value)) $data[$key] = implode(' - ',$value);

?>


Blijkbaar zijn alle waarden arrays, en op deze manier "sla je ze plat" tot een enkele string. Als er maar een enkele waarde in de array zit maakt dit effectief niets uit.
 
Joris R

Joris R

18/10/2020 21:30:49
Quote Anchor link
Wauw, geweldig! Het werkt helemaal!
Super bedankt! :)
 
Thomas van den Heuvel

Thomas van den Heuvel

19/10/2020 17:29:57
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$query = urldecode($_GET["query"]);

Waarom doe je dat? $_GET variabelen worden automatisch gedecodeerd. Geen reden om dat nog een keer te doen?\

EDIT: en voor de goede orde zou alles wat je terugstopt in de querystring weer ge-escaped moeten worden, bijvoorbeeld met urlencode(). Ook zou de ampersand (&) in HTML ge-escaped moeten worden naar &amp;.
Gewijzigd op 19/10/2020 20:23:24 door Thomas van den Heuvel
 
Joris R

Joris R

21/10/2020 12:44:49
Quote Anchor link
Hoi Thomas, excuus voor mijn late reactie. Maar bedankt voor je toevoegingen! Ik ga er meteen naar kijken!
Ik ben nog vrij nieuw met PHP en ben daarom erg blij met deze hulp!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.