2010-05-07 11 views
2

J'ai une table que je n'arrive pas à dimensionner correctement. Le tableau contient des informations provenant d'une base de données via une boucle. Parfois, si les données sont trop longues, la table s'étend au-delà de ce qu'elle devrait être. Lorsque les données sont aussi longues, je veux que les données s'enroulent dans les cellules afin que la table reste là où elle le devrait. J'ai essayé les données de table normales mais cela ne fonctionne pas. Des idées?PHP La table HTML est trop large

<?php 
    echo "<table> 
     <tr> 
      <th>id</th> 
      <th>700-number</th> 
      <th>First name</th> 
      <th>Last name</th> 
      <th>Email</th> 
      <th>Response</th> 
      <th>Created On</th> 
     </tr>"; 

    $num = mysql_num_rows($result); 

    for ($i = 0; $i < $num; $i++) 
    { 
     $row = mysql_fetch_array($result); 

     $id = $row['id']; 
     $school_id = $row['school_id']; 
     $fname = $row['first_name']; 
     $lname = $row['last_name']; 
     $email = $row['email']; 
     $attending = ($row['attending'] == 0) ? 'No' : 'Yes'; 
     $date = $row['created_on']; 

     $class = (($i % 2) == 0) ? "td2" : "td1"; 

     echo "<tr>"; 
      echo "<td class=" . $class . ">$id</td>"; 
      echo "<td class=" . $class . ">$school_id</td>"; 
      echo "<td class=" . $class . ">$fname</td>"; 
      echo "<td class=" . $class . ">$lname</td>"; 
      echo "<td class=" . $class . ">$email</td>"; 
      echo "<td class=" . $class . ">$attending</td>"; 
      echo "<td class=" . $class . ">$date</td>"; 
     echo "</tr>"; 
    } 
?> 
</table> 

EDIT

Ce tableau est affiché dans un récipient qui est fixé à 800px de large, donc définir un pourcentage de la table ne fonctionnera pas. Je veux le définir à une taille de pixel spécifique, comme 600px. Je préférerais également ne pas modifier le CSS, je veux fixer la taille en modifiant le code que j'ai posté.

EDIT

Il doit y avoir quelqu'un qui connaît la réponse à cette question. J'ai essayé toutes les suggestions jusqu'ici, en HTML et CSS mais en vain. Je sais qu'il doit y avoir un petit problème avec mon code que je ne vois pas (c'est-à-dire une balise ouverte, un point-virgule manquant, une citation unique où il devrait s'agir d'une double citation, etc.). J'ai utilisé firebug en essayant de trouver la cause de ce problème et j'ai trouvé que lorsque je supprime toutes les données des classes CSS .td1 et .td2 que la largeur que j'ai spécifié colle bien. Y a-t-il une raison pour que la largeur soit gâchée par une classe CSS?

EDIT

a finalement obtenu ce travail avec droit wordwrap et le dimensionnement des étiquettes manuellement. Voici le code correct:

<table> 
    <tr> 
     <th width="16px">ID</th> 
     <th width="81px">700<br />Number</th> 
     <th width="90px">First<br />Name</th> 
     <th width="90px">Last<br />Name</th> 
     <th width="181px">E-Mail</th> 
     <th width="74px">Attending</th> 
     <th width="82px">Created<br />On</th> 
    </tr> 
<?php 
$num = mysql_num_rows($result); 

for ($i = 0; $i < $num; $i++) 
{ 
    $row = mysql_fetch_array($result); 

    $id = $row['id']; 
    $school_id = $row['school_id']; 
    $fname = $row['first_name']; 
    $lname = $row['last_name']; 
    $email = $row['email']; 
    $attending = ($row['attending'] == 0) ? 'No' : 'Yes'; 
    $date = $row['created_on']; 

    $wrap_id = wordwrap($id, 4, "\n", TRUE); 
    $wrap_school_id = wordwrap($school_id, 9, "\n", TRUE); 
    $wrap_fname = wordwrap($fname, 10,"\n", TRUE); 
    $wrap_lname = wordwrap($lname, 10, "\n", TRUE); 
    $wrap_email = wordwrap($email, 20, "\n", TRUE); 
    $wrap_attending = wordwrap($attending, 3, "\n", TRUE); 
    $wrap_date = wordwrap($date, 10, "\n", TRUE); 

    $class = (($i % 2) == 0) ? "td2" : "td1"; 

    echo "<tr>"; 
     echo "<td class=" . $class . ">$wrap_id</td>"; 
     echo "<td class=" . $class . ">$wrap_school_id</td>"; 
     echo "<td class=" . $class . ">$wrap_fname</td>"; 
     echo "<td class=" . $class . ">$wrap_lname</td>"; 
     echo "<td class=" . $class . ">$wrap_email</td>"; 
     echo "<td class=" . $class . ">$wrap_attending</td>"; 
     echo "<td class=" . $class . ">$wrap_date</td>"; 
    echo "</tr>"; 
} 

?> 

</table> 
+0

Juste un sidenote, pas une réponse: pourquoi n'utilisez-vous pas 'while (false! == ($ row = mysql_fetch_array ($ result)))'? Mieux que cette supercherie. – Maerlyn

+0

Coller votre façon d'utiliser la fonction worwrap leme voir y il ne fonctionne pas pour vous .... –

+0

Découvrez par la dernière réponse éditée .... –

Répondre

2

Fixer la hauteur et la largeur de la table afin d'obtenir les données enveloppées dans la table ...

Aussi, vous pouvez utiliser la fonction wordwrap Wraps une chaîne à un nombre donné de caractères à l'aide d'une chaîne pause personnage.

Syntaxe: string wordwrap ( string $str [, int $width = 75 [, string $break = "\n" [, bool $cut = false ]]])

str 

    The input string. 
width 

    The column width. 
break 

    The line is broken using the optional break parameter. 
cut 

    If the cut is set to TRUE, the string is always wrapped at or before the specified width. So if you have a word that is larger than the given width, it is broken apart. (See second example). 


Returns the given string wrapped at the specified column. 

MISE À JOUR DE REPONDRE

Selon votre question édita vaut mieux pour vous d'utiliser la ligne automatique comme je l'ai expliqué ci-dessus ..

Par exemple:

<?php 
$text = "Typoking wants to know about "Php html table is too wide"."; 
$newtext = wordwrap($text, 20, "<br />\n"); 

echo $newtext; 
?> 

The above example will output: 

Typoking wants to kn<br /> 
ow about "Php html t<br /> 
able is too wide". 

Pour plus d'informations: PHP.net

ÉDITÉE

Selon votre problème CSS, ouvrez votre fichier css et écrire "!important" à côté de la classe qui est utilisée par "<td>" . Cela va préférer votre classe CSS à appliquer que le style en ligne. Fournissez également la façon dont vous appliquez le word-wrap ...

+0

Je comprends ce que vous dites, et j'ai essayé Wordwrap, mais il ne fonctionne pas avec le code que j'ai pour une raison quelconque. – ubiquibacon

+0

Pourquoi avez-vous ** intentionnellement ** des mots mal orthographiés? Toute la réponse a l'air terrible non professionnelle de cette façon. – BalusC

+0

@BalusC Excusez-moi, Pourquoi aurais-je mal orthographier les mots? Et où je l'ai fait? Et si nous parlons de formulaires courts, comme je viens de le faire dans cette déclaration, ce n'est pas faute d'orthographe, aucun utilisateur n'est payé pour être professionnel ici, et nous ne sommes pas ici pour montrer notre professionnalisme, nous sommes ici pour passer le mot de la connaissance. Si le chercheur comprend la réponse et gagne, c'est le but principal ... Je suis ici pour apprendre et faire apprendre d'autres ... Ayant un grand score de réputation ne signifie pas que vous pouvez pointer vers quelqu'un que vous voulez pour des raisons de récurer –

0

Essayez définir le style à

word-wrap: break-word; 

(Je suppose que vous avez des données sans espace qui est à l'origine de la table pour se développer.) Vous pouvez également explicitement définir la largeur de la table.

+0

Fatigué, ne fonctionne pas. – ubiquibacon

0

Utilisez comme ceci, vous obtiendrez la bonne réponse. Onething vous pouvez ajuster aucun caractère dans Wordwrap selon la largeur.

<?php 
    echo "<table width='800'> 
     <tr> 
      <th width='50'>id</th> 
      <th width='100'>700-number</th> 
      <th width='150'>First name</th> 
      <th width='150'>Last name</th> 
      <th width='100'>Email</th> 
      <th width='150'>Response</th> 
      <th width='100'>Created On</th> 
     </tr>"; 

    $num = mysql_num_rows($result); 

    for ($i = 0; $i < $num; $i++) 
    { 
     $row = mysql_fetch_array($result); 

     $id = $row['id']; 
     $school_id = $row['school_id']; 
     $fname = $row['first_name']; 
     $lname = $row['last_name']; 
     $email = $row['email']; 
     $attending = ($row['attending'] == 0) ? 'No' : 'Yes'; 
     $date = $row['created_on']; 

     $class = (($i % 2) == 0) ? "td2" : "td1"; 

     echo "<tr>"; 
      echo "<td class=" . $class . ">$id</td>"; 
      echo "<td class=" . $class . ">wordwrap($school_id, 8, '\n', 1); </td>"; 
      echo "<td class=" . $class . ">wordwrap($fname, 15, '\n', 1);</td>"; 
      echo "<td class=" . $class . ">wordwrap($lname, 20, '\n', 1);</td>"; 
      echo "<td class=" . $class . ">wordwrap($email, 20, '\n', 1);</td>"; 
      echo "<td class=" . $class . ">wordwrap($attending, 30, '\n', 1);</td>"; 
      echo "<td class=" . $class . ">wordwrap($date, 10, '\n', 1);</td>"; 
     echo "</tr>"; 
    } 
?> 
</table> 
+0

J'ai dit dans ma question originale que j'ai déjà essayé la manière normale de le faire et cela n'a pas fonctionné pour une raison quelconque. – ubiquibacon

+0

quel est le problème obtenez-vous maintenant? en fonction de la largeur, vous pouvez corriger le caractère dans wordwrap, cela va résoudre le problème. – Karthik

+0

Si j'utilise Wordwrap comme vous l'avez dans votre réponse alors "wordwrap" apparaîtra réellement sur l'écran. Je ne sais pas comment utiliser correctement wordwrap dans le code que j'ai. – ubiquibacon

0

Vous devez utiliser largeur propriété sur col balises <col width="60px"> pour définir la largeur de chaque colonne et non sur <th> tags. Maintenant, le contenu encapsulera les mots entiers à la taille de la propriété col width ou à la taille de la plus longue chaîne d'une ligne. Utilisez css break-word sur <td> tag

mot-wrap: break-word;

pour conserver la taille exacte définie dans la propriété col width.

Questions connexes