[PHP] Opsplitsen van query

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Beste lezers, ik heb een vraag...

De vraag
Ik haal een string uit de database, en heb deze met een function bewerkt, zodat hij na 200 karakters de eerste spatie opzoekt, en daar de string beëindigd. (Dat werkt)

Ik wil nu vanaf dat laatste woord weer beginnen, voor onder mijn "read more" button.

De Code

limit_string(); doet het wel
pick_string(); doet het niet
PHP:
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
//Limit - De functie die wel werkt - Stopt de string 
//na 200 karakters, na het vinden van een spatie.
//Het resultaat daarvan is dat ik alleen hele woorden heb.

                function limit_string($string, $charlimit)
                {
                   if(substr($string,$charlimit-1,1) != ' ')
                   {
                       $string = substr($string,'0',$charlimit);
                       $array = explode(' ',$string);
                       array_pop($array);
                       $new_string = implode(' ',$array);
                
                       return $new_string.'...';
                   }
                   else
                   {   
                       return substr($string,'0',$charlimit-1).'...';
                   }
                }

//Pickup - Deze functie werkt niet - Ik wil graag dat deze functie 
//verder gaat waar limit_string() ophield.

                  function pick_string($string, $charlimit)
                {
                   if(substr($string,$charlimit-1) != ' ')
                   {
                       $string = substr($string, $charlimit);
                       $array = explode(' ',$string);
                       array_pop($array);
                       $new_string = implode(' ',$array);
                
                       return $new_string;
                   }
                   else
                   {   
                       return substr($string,$charlimit-1);
                   }
                }


Zou ik nu dus:
PHP:
1
echo(limit_string("Dit is een test", 5));
Doen, dan output hij: "Dit is..."

Het is de bedoeling dat pick_string() weer verder gaat vanaf dat punt, dus "...een test"

Ik hoop dat jullie mij kunnen verder helpen.

[ Voor 11% gewijzigd door Verwijderd op 07-09-2006 02:42 ]


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Een compleet andere oplossing dan je twee functies is gebruik maken van de mogelijkheden van je database.
Bijvoorbeeld de volgende code geeft je de twee delen tegelijk terug uit de database.
code:
1
select left(body,locate(" ",body,200)), substring(body,locate(" ",body,200)) from MyTable where id=9096

Een andere oplossing is om een wat makkelijkere algoritme te nemen door gebruik te maken van handige functies die PHP je bied, bijvoorbeeld strpos. Door gebruik te maken van de offset kan je dus midden in een string beginnen te zoeken, bovendien zal dat een stuk sneller zijn dan je huidige algoritme.

[ Voor 0% gewijzigd door dusty op 07-09-2006 03:23 . Reden: Ziek zijn zuigt. ]

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

je bedoelt hoop ik een algoritme :?
Dusty's oplossing vind ik erg netjes, als dat werkt. Wat je beter kan doen dan zoals je het nu doet: maak 1 functie die beide teruggeeft. Hoef je maar 1x op zoek, scheelt weer wat gedoe. Ik zou met strpos ofzo naar de eerste spatie vóór 200 zoeken, en dan daarop de string splitsen met substr ofzo. Vervolgens geef je de 2 strings in een array terug, die je vervolgens gebruikt in je output.

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

MBV schreef op donderdag 07 september 2006 @ 03:10:
je bedoelt hoop ik een algoritme :?
Uiteraard, ik gooi de verwarring op mijn griep en gebrek aan slaap de paar laatste dagen (vanwege de griep)
Dusty's oplossing vind ik erg netjes, als dat werkt.
[..]
Als de database MySQL is, werkt hij perfect en snel (zolang je uiteraard de juiste veldnamen en tabelnaam invult :+ )

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • sjhgvr
  • Registratie: Januari 2004
  • Laatst online: 04-08 14:27
Misschien heeft t nog wat debugging nodig, maar t werkt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
function limit_string($string, $charlimit, $showmore) {
 if ($charlimit < strlen($string)) {
  if ($showmore) {
   $array = explode(' ', $string);
   $count = 0;
   foreach ($array as $piece) {
    $count += strlen($piece) + 1;
    if ($charlimit >= $count) array_shift($array);
    else break;
   }
   return '... ' . implode(' ', $array);
  } else {
   $array = explode(' ', substr($string, '0', $charlimit));
   array_pop($array);
   return implode(' ', $array) . ' ...';
  }
 } else if (!$showmore) return $string;
 return false;
}
$teststring = 'De PlayStation 3 komt in Europa pas volgend jaar maart op de markt. De console, die volgens eerdere berichten al op 17 november in de winkel zou liggen, kan niet in voldoende grote oplage geproduceerd worden vanwege problemen met de fabricage van de benodigde blauwelaserdiodes';
$cutoff = 200;
echo limit_string($teststring, $cutoff, false) . '<br>' . limit_string($teststring, $cutoff, true);
?>

[ Voor 14% gewijzigd door sjhgvr op 07-09-2006 05:56 . Reden: code stukkie herschreven ]

oisd.nl


  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 19-09 21:26

DataGhost

iPL dev

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function limit_string($string, $charlimit) {
    $limited = wordwrap($string, $charlimit, '<||>');
    $eerstedeel = substr($limited, 0, strpos($limited, '<||>'));
    return $eerstedeel;
}

function pick_string($string, $charlimit) {
    $limited = wordwrap($string, $charlimit, '<||>');
    $begintweededeel = strpos($limited, '<||>')+1;
    $tweededeel = substr($string, $begintweededeel);
    return $tweededeel;
}

$aap = "De snelle bruine vos springt over de luie hond.";
echo "Limit 15: ". limit_string($aap, 15) ."\n";
echo "Rest    : ". pick_string($aap, 15) ."\n";


code:
1
2
3
helios ~ # php limstr 
Limit 15: De snelle
Rest    : bruine vos springt over de luie hond.


Voordeel van wordwrap is dat je nooit over de 200 tekens heengaat, als dat een groot probleem is moet je de functie maar even aanpassen :+ maar hier is in elk geval een begin :)
edit: voor de duidelijkheid dus, wordwrap zoekt niet na 200 tekens de eerste spatie maar voor 200 tekens de laatste.

[ Voor 6% gewijzigd door DataGhost op 07-09-2006 07:07 ]


  • sjhgvr
  • Registratie: Januari 2004
  • Laatst online: 04-08 14:27
@ DataGhost
Kheb je script ff aangepast zodat t een beetje meer doet wat de TS wil (niet verkeerd bedoelt, alle respect gaat naar jou ;)):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function stringCut($string, $charlimit, $showmore) {
 if ($charlimit < strlen($string)) {
  if ($showmore) return '... ' . substr($string, strpos(wordwrap($string, $charlimit, '<||>'), '<||>')+1);
  else {
   $limited = wordwrap($string, $charlimit, '<||>');
   return substr($limited, 0, strpos($limited, '<||>')) . ' ...';
  }
 } else if (!$showmore) return $string;
}
$string = 'The quick brown fox jumps over the lazy dog.';
$maxchr = 15;
echo stringCut($string, $maxchr, false) . '<br>' . stringCut($string, $maxchr, true);
?>
Nu kan de text korter zijn dan maxchr.
Oja .. en zorg aub dat <||> niet letterlijk voorkomt in de $string anders krijg je problemen, maar dat zal wel goed zitten aangezien je htmlchars escape-d .. hoop ik :P

oisd.nl


  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 19-09 21:26

DataGhost

iPL dev

mja <||> is niet echt een dagelijks voorkomende combinatie, zeker niet in html, het is geen geldige tag namelijk :+ daarom dat ik die gekozen heb. Newlines kunnen er altijd inzitten, daar kan ik niet op vertrouwen dus.

  • sjhgvr
  • Registratie: Januari 2004
  • Laatst online: 04-08 14:27
En dan kan t altijd nog korter :+
PHP:
1
2
3
4
5
6
7
8
<?php
function stringCut($s,$l,$e){
$r='<';$t=wordwrap($s,$l,$r);$u=strpos($t,$r);
return $l<strlen($s)?($e?'... '.substr($s,$u+1):
substr($t,0,$u).' ...'):(!$e?$s:0);}
$txt='The quick brown fox jumps over the lazy dog.';$m=15;
echo stringCut($txt,$m,0).'<br>'.stringCut($txt,$m,1);
?>

[ Voor 11% gewijzigd door sjhgvr op 07-09-2006 10:07 ]

oisd.nl


  • Zyppora
  • Registratie: December 2005
  • Laatst online: 12-09 10:59

Zyppora

155/50 Warlock

DapinododiadeaL schreef op donderdag 07 september 2006 @ 07:56:
En dan kan t altijd nog korter :+
PHP:
1
2
3
4
5
6
7
8
9
<?php
function stringCut($s,$l,$e){
$r='<';$t=wordwrap($s,$l,$r);
return $l<strlen($s)?($e?'... '.substr($s,strpos($t,$r)+1):substr($t,0,strpos($t,$r)).' ...'):(!$e?$s:0);
}
$txt='The quick brown fox jumps over the lazy dog.';
$m=15;
echo stringCut($txt,$m,0).'<br>'.stringCut($txt,$m,1);
?>
Dat kan ... maar mocht je dit script na 6 maand aan moeten passen, kun je weer overnieuw beginnen (overdreven, weet ik, maar de moraal komt nog).

Je moet eigenlijk de variabelen zo willen benoemen dat je eruit kunt halen wat ze zijn/doen/etc. Dus niet $s, maar $start, niet $l, maar $length, niet $e, maar $end, etc.

Het ziet her zo heel strak uit, lekker kort en bondig, maar wanneer onderhoud (zeker wanneer je grotere scripts hebt) of uitbreiding nodig is, zul je spijt krijgen.

Phenom II X4 945 \\ 8GB DDR3 \\ Crosshair IV Formula \\ R9 290


  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Daarnaast, PHP negeert spaties, returns, enzovoort. Het is wel kort, maar een paar spaties en returns maken niet uit voor de snelheid (voor zover ik weet)

Ik vind persoonlijk de SQL-optie iets mooier en hoogstwaarschijnlijk ook sneller, weet niet of die ook escaped op de spatie voor 200, maarja.

Ohja, en wiel opnieuw uitvinden hierzo: http://nl3.php.net/wordwrap

(weet niet of die precies hetzelfde doet, maar het lijkt er wel veel op)

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

ehm, dat staat in alledrie de 'code-posts' boven je 8)7

Verwijderd

Topicstarter
Halleluja wat een replies, het is net een wedstrijd hier :D

Bedankt voor jullie antwoorden, met deze info kom ik er wel uit denk ik...zo niet, horen jullie het ;)

Verwijderd

Topicstarter
Helaas krijg ik het niet aan de gang...De SQL aanvraag (Mijn DB is inderdaad MySQL), levert de volgende error op:

code:
1
Parse error: parse error, unexpected T_CONSTANT_ENCAPSED_STRING in c:\domains\messiah-clan.com\wwwroot\news_view.php on line 24

Als ik dit doe met de code:
PHP:
1
2
$id = $rij["id"];
$test = mysql_query("select left(item,locate(" ",item,200)), substring(item,locate(" ",$item,200)) from news where id=$id");
Ik ging ervan uit dat waar jij "body" had staan, dat daar de naam van het veld moest komen, dat werkte dus niet, ook niet als ik hier gewoon body liet staan. Nu moet ik eerlijk bekennen dat ik hier ook geen verstand van heb :)

Ik heb de functie van DapinododiadeaL ook geprobeerd. Deze scheen alles goed te doen, maar omdat de text die hij uit de database moet halen ook tags bevat voor de opmaak van de text, kreeg ik de output van alles, of niets. (Het eerste deel werd dus ..., het tweede deel begon met een stuk opmaaktags, gevold door de rest van de text, ik had $m toen wel op 200 staan.) Bij $m = 500; kreeg ik wel de hele text te zien, met de opmaak...alleen werd er dan onder "read more" niets meer weergegeven, simpelweg omdat hij alles al had gehad.

Screenshot: [Nadat ik op "Would you like to know more? heb geklikt]


Afbeeldingslocatie: http://www.messiah-clan.com/textitem.jpg


Dat vond ik nogal vaag, omdat hij het eerste deel dan afkapt ruim voor de 200 karakters voorbij zijn.

[ Voor 8% gewijzigd door Verwijderd op 07-09-2006 13:44 ]


  • Zyppora
  • Registratie: December 2005
  • Laatst online: 12-09 10:59

Zyppora

155/50 Warlock

Da's geen SQL error, maar een PHP error.

Kun je ons een glimp van regel 24 (en omstreken) van je code laten zien?

Overigens kun je het beste verschillende quotes gebruiken voor je SQL query:

code:
1
$test = mysql_query("select left(item,locate(' ',item,200)), substring(item,locate(' ',$item,200)) from news where id=$id");

Phenom II X4 945 \\ 8GB DDR3 \\ Crosshair IV Formula \\ R9 290


Verwijderd

Topicstarter
jazeker kan dat...

PHP:
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
<?php
          mysql_connect("x", "x", "x");
          mysql_select_db("x");
          
          $sql = "SELECT * FROM news ORDER BY id DESC LIMIT 5";
          $result = mysql_query($sql);
    
          if (mysql_num_rows($result) >= 0)
          {
    
            while ($rij = mysql_fetch_array($result))
            {
                
                $id = $rij["id"];
                $test = mysql_query("select left(item,locate(' ',item,200)), substring(item,locate(' ',$item,200)) from news where id=$id");
                
                echo"
                <table width='600' border='0' cellpadding='0' cellspacing='0'>
                  <tr> 
                    <td width='600' height='20' align='center' valign='middle' background='../img/news/bar.jpg'><strong>".$rij["title"]."</strong></td>
                  </tr>
                  <tr> 
                    <td height='45' valign='top'><img src='img/news/".$rij["subject"].".jpg' width='600' height='70'></td>
                  </tr>
                  <tr> 
                    <td height='19' align='right' valign='middle'><div align='right'> 
                        <blockquote><strong>By ".$rij["author"]." on ".$rij["date"]."</strong></blockquote>
                      </div></td>
                  </tr>
                  <tr> 
                    <td height='19' valign='top'><blockquote><font size='2'>";
                    echo "$test";
                    echo"</font></blockquote></td>
                  </tr>";
                  ?>
                        <script type="text/javascript">
                          <!--
                            function toonVerbergInfo(divId) {
                              if(document.getElementById(divId).style.display == "none") {
                                //div weergeven
                                document.getElementById(divId).style.display = "block";
                              }
                              else {
                                //div verbergen
                                document.getElementById(divId).style.display = "none";
                              }
                            }
                          -->
                        </script>
<?php
                  echo"
                      <tr>
                        <td height='19' align='left' valign='top'> <img src='../img/plus.gif' width='11' height='11'>"; ?> <a href="#" onclick="toonVerbergInfo('<?php echo"".$rij["id"].""; ?>');return false"> Would you like to know more?</a> <?php echo"</td>
                      </tr>
                      <tr> 
                        <td height='19' valign='top'><blockquote><font size='2'>"; ?><div id="<?php echo "".$rij["id"].""; ?>" style="display:none;"><?php echo "$rest"; ?></div> <?php echo"</font></blockquote></td>
                      </tr>
                    </table>";
            }
          }
          
          if (mysql_num_rows($result) == 0)
          {
            echo "<hr>There are no items in the database to display</strong>";
          }
?>


Dat is de gehele code, ik heb de vorige functies eruit gehaald, dus regel 24 is nu regel 15 ;)

  • Zyppora
  • Registratie: December 2005
  • Laatst online: 12-09 10:59

Zyppora

155/50 Warlock

PHP:
1
$test = mysql_query("select left(item,locate(' ',item,200)), substring(item,locate(' ',$item,200)) from news where id=$id");


In het SUBSTRING() gedeelte heb je $item staan. Is dit een variabele of een typo? ;)

PHP:
1
echo "$test";


Als je hier de quotes eens weghaalt (weet niet of het uitmaakt, maar het maakt de code wel overzichtelijker en IMHO netter). Hou je er wel rekening mee dat $test een array is van de LEFT() constructie (eerste 200 karakters) en de SUBSTRING() constructie uit je SQL query?

De rest heb ik niet met hele scherpe ogen aangekeken, maar op het eerste gezicht zag het er niet slecht uit.

Edit: Gequote zut opruimen ...
* Zyppora veegt nog wat [/quote] tags weg

[ Voor 14% gewijzigd door Zyppora op 07-09-2006 15:07 ]

Phenom II X4 945 \\ 8GB DDR3 \\ Crosshair IV Formula \\ R9 290


Verwijderd

Topicstarter
Ik wil iedereen hartelijk bedankten voor zijn bijdrage...ik heb het probleem nu opgelost :)

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Verwijderd schreef op donderdag 07 september 2006 @ 13:41:
[..]
Als ik dit doe met de code:
PHP:
1
2
$id = $rij["id"];
$test = mysql_query("select left(item,locate(" ",item,200)), substring(item,locate(" ",$item,200)) from news where id=$id");
[..]
Dat klopt, je doet in principe nu:
code:
1
$hallo="hij zei:"hallo".";

Probleem is dus dat je de quotes BINNEN de string niet escaped.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR

Pagina: 1