Jump to content

Weird XHTML validation errors


joemamahunt

Recommended Posts

 

2 weird errors, 1 weird warning.

 



 

1. In the part of a code below, XHTML validator gives me error:

document type does not allow element "select" here; missing one of "p", "h1", "h2", "h3", "h4", "h5", "h6", "div", "pre", "address", "fieldset", "ins", "del" start-tag.

But not just for the select tab, for the input tags, span, and br tags also.

 

Here:

					<td valign="top" align="left" class="smalltext" style="font-family: verdana, arial, sans-serif;">';

echo '					<script type="text/javascript" src="', $settings['default_theme_url'], '/sha1.js"></script>

							<form action="', $scripturl, '?action=login2" method="post" accept-charset="', $context['character_set'], '" class="middletext" style="margin: 3px 1ex 1px 0;"', empty($context['disable_login_hashing']) ? ' onsubmit="hashLoginPassword(this, \'' . $context['session_id'] . '\');"' : '', '>
								<input type="text" name="user" size="10" /> <input type="password" name="passwrd" size="10" />
								<select name="cookielength">
									<option value="60">', $txt['smf53'], '</option>
									<option value="1440">', $txt['smf47'], '</option>
									<option value="10080">', $txt['smf48'], '</option>
									<option value="43200">', $txt['smf49'], '</option>
									<option value="-1" selected="selected">', $txt['smf50'], '</option>
								</select>
								<input type="submit" value="', $txt[34], '" /><br />
								<span class="middletext">', $txt['smf52'], '</span>
								<input type="hidden" name="hash_passwrd" value="" />
							</form><br />';
}
						echo '</td>

 

 



 

 

2. For each outcome ('a' tag), it gives me:

document type does not allow element "a" here; missing one of "object", "ins", "del", "span", "bdo", "tt", "i", "b", "big", "small", "em", "strong", "dfn", "code", "q", "samp", "kbd", "var", "cite", "abbr", "acronym", "sub", "sup", "label" start-tag.

 

The code is this:

                       	<td class="lat" style="font-size: x-small; padding: 4px;" valign="top" align="left">';
                             	$what=ssi_recentTopicsT('5', NULL, 'array');  
                             	foreach ($what as $topic) {
                             	echo'<span style="font-size: 80%;">-</span> 
			       <a href="', $topic['href'], '">', $topic['link'], '</a><br />'; 
                             	} 
                             	echo '
                       	</td>

 

Which refers to another file, this is the code from it:

// Recent topic list:   [board] Subject by Poster	Date
function ssi_recentTopicsT($num_recent = 8, $exclude_boards = null, $output_method = 'echo')
{
global $context, $settings, $scripturl, $txt, $db_prefix, $ID_MEMBER;
global $user_info, $modSettings, $func;

if ($exclude_boards === null && !empty($modSettings['recycle_enable']) && $modSettings['recycle_board'] > 0)
	$exclude_boards = array($modSettings['recycle_board']);
else
	$exclude_boards = empty($exclude_boards) ? array() : $exclude_boards;

$stable_icons = array('xx', 'thumbup', 'thumbdown', 'exclamation', 'question', 'lamp', 'smiley', 'angry', 'cheesy', 'grin', 'sad', 'wink', 'moved', 'recycled', 'wireless');
$icon_sources = array();
foreach ($stable_icons as $icon)
	$icon_sources[$icon] = 'images_url';

// Find all the posts in distinct topics.  Newer ones will have higher IDs.
$request = db_query("
	SELECT
		m.posterTime, ms.subject, m.ID_TOPIC, m.ID_MEMBER, m.ID_MSG, b.ID_BOARD, b.name AS bName,
		IFNULL(mem.realName, m.posterName) AS posterName, " . ($user_info['is_guest'] ? '1 AS isRead, 0 AS new_from' : '
		IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, 0)) >= m.ID_MSG_MODIFIED AS isRead,
		IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, -1)) + 1 AS new_from') . ", LEFT(m.body, 384) AS body, m.smileysEnabled, m.icon
	FROM ({$db_prefix}messages AS m, {$db_prefix}topics AS t, {$db_prefix}boards AS b, {$db_prefix}messages AS ms)
		LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)" . (!$user_info['is_guest'] ? "
		LEFT JOIN {$db_prefix}log_topics AS lt ON (lt.ID_TOPIC = t.ID_TOPIC AND lt.ID_MEMBER = $ID_MEMBER)
		LEFT JOIN {$db_prefix}log_mark_read AS lmr ON (lmr.ID_BOARD = b.ID_BOARD AND lmr.ID_MEMBER = $ID_MEMBER)" : '') . "
	WHERE t.ID_LAST_MSG >= " . ($modSettings['maxMsgID'] - 35 * min($num_recent, 5)) . "
		AND t.ID_LAST_MSG = m.ID_MSG
		AND b.ID_BOARD = t.ID_BOARD" . (empty($exclude_boards) ? '' : "
		AND b.ID_BOARD NOT IN (" . implode(', ', $exclude_boards) . ")") . "
		AND $user_info[query_see_board]
		AND ms.ID_MSG = t.ID_FIRST_MSG
	ORDER BY t.ID_FIRST_MSG DESC
	LIMIT $num_recent", __FILE__, __LINE__);
$posts = array();
while ($row = mysql_fetch_assoc($request))
{
	$row['body'] = strip_tags(strtr(parse_bbc($row['body'], $row['smileysEnabled'], $row['ID_MSG']), array('<br />' => '&#10;')));
	if ($func['strlen']($row['body']) > 128)
		$row['body'] = $func['substr']($row['body'], 0, 128) . '...';

	// Censor the subject.
	censorText($row['subject']);
	censorText($row['body']);

	if (empty($modSettings['messageIconChecks_disable']) && !isset($icon_sources[$row['icon']]))
		$icon_sources[$row['icon']] = file_exists($settings['theme_dir'] . '/images/post/' . $row['icon'] . '.gif') ? 'images_url' : 'default_images_url';

	// Build the array.
	$posts[] = array(
		'board' => array(
			'id' => $row['ID_BOARD'],
			'name' => $row['bName'],
			'href' => $scripturl . '?board=' . $row['ID_BOARD'] . '.0',
			'link' => '<a href="' . $scripturl . '?board=' . $row['ID_BOARD'] . '.0">' . $row['bName'] . '</a>'
		),
		'topic' => $row['ID_TOPIC'],
		'poster' => array(
			'id' => $row['ID_MEMBER'],
			'name' => $row['posterName'],
			'href' => empty($row['ID_MEMBER']) ? '' : $scripturl . '?action=profile;u=' . $row['ID_MEMBER'],
			'link' => empty($row['ID_MEMBER']) ? $row['posterName'] : '<a href="' . $scripturl . '?action=profile;u=' . $row['ID_MEMBER'] . '">' . $row['posterName'] . '</a>'
		),
		'subject' => $row['subject'],
		'short_subject' => shorten_subject($row['subject'], 25),
		'preview' => $row['body'],
		'time' => timeformat($row['posterTime']),
		'timestamp' => forum_time(true, $row['posterTime']),
		'href' => $scripturl . '?topic=' . $row['ID_TOPIC'] . '.msg' . $row['ID_MSG'] . ';topicseen#new',
		'link' => '<a href="' . $scripturl . '?topic=' . $row['ID_TOPIC'] . '.msg' . $row['ID_MSG'] . '#new">' . (strlen($row['subject']) > 36 ? substr($row['subject'],0,36) . "..." : $row['subject']) . '</a>',
		'new' => !empty($row['isRead']),
		'new_from' => $row['new_from'],
		'icon' => '<img src="' . $settings[$icon_sources[$row['icon']]] . '/post/' . $row['icon'] . '.gif" align="middle" alt="' . $row['icon'] . '" border="0" />',
	);
}
mysql_free_result($request);

// Just return it.
if ($output_method != 'echo' || empty($posts))
	return $posts;

echo '
	<table border="0" class="ssi_table">';
foreach ($posts as $post)
	echo '
		<tr>
			<td align="right" valign="top" nowrap="nowrap">
				[', $post['board']['link'], ']
			</td>
			<td valign="top">
				<a href="', $post['href'], '">', $post['subject'], '</a>
				', $txt[525], ' ', $post['poster']['link'], '
				', $post['new'] ? '' : '<a href="' . $scripturl . '?topic=' . $post['topic'] . '.msg' . $post['new_from'] . ';topicseen#new"><img src="' . $settings['images_url'] . '/' . $context['user']['language'] . '/new.gif" alt="' . $txt[302] . '" border="0" /></a>', '
			</td>
			<td align="right" nowrap="nowrap">
				', $post['time'], '
			</td>
		</tr>';
echo '
	</table>';
}

 

 

 



 

 

3. Then it gives me this warning:

character "<" is the first character of a delimiter but occurred as data

 

For each of the "<"s in this code:

				      <td valign="top" align="right" class="mnu">
                                        <div id="clock"></div>
				<script type="text/javascript">
					var months=new Array(13);
						months[1]="January";
						months[2]="February";
						months[3]="March";
						months[4]="April";
						months[5]="May";
						months[6]="June";
						months[7]="July";
						months[8]="August";
						months[9]="September";
						months[10]="October";
						months[11]="November";
						months[12]="December";
					var time=new Date();
					var lmonth=months[time.getMonth() + 1];
					var date=time.getDate();
					var year=time.getYear();

				if (year < 2000)    // Y2K Fix, Isaac Powell
					year = year + 1900; // http://onyx.idbsu.edu/~ipowell

					var timerID = null;
					var timerRunning = false;

					function showtime () {
						var now = new Date();
						var hours = now.getHours();
						var minutes = now.getMinutes();
						var seconds = now.getSeconds()
						var timeValue = "" + ((hours >12) ? hours -12 :hours)
						if (timeValue == "0") timeValue = 12;
						timeValue += ((minutes < 10) ? ":0" : ":") + minutes
						timeValue += ((seconds < 10) ? ":0" : ":") + seconds
						timeValue += (hours >= 12) ? " P.M." : " A.M."
						document.getElementById("clock").innerHTML = lmonth + " " + date + ", " + year + "  |  " + timeValue;
						timerID = setTimeout("showtime()",1000);
						timerRunning = true;
					}

					showtime();
				</script>
			      </td>

 

 




 

 

Any help is greatly appreciated.  I've been into PHP and XHTML for some time now, have never came across errors this weird.

Link to comment
https://forums.phpfreaks.com/topic/57683-weird-xhtml-validation-errors/
Share on other sites

I believe strict XHTML doesn't allow input and select outside of particular elements.  It's given you a list of elements it is allowed inside.  Check the source of http://validator.w3.org/ for a valid example.

 

But seriously, I would rather relax your doctype than make all your html strict.  It'll drive you bonkers :P

 

Your warning is probably from the "<" in your javascript (which is "data").  I'm not sure what the "strict" way to do it is.

Oh yeah, I forgot to mention it's XHTML Strict.

 

Actually I've done quite a number of XHTML Strict sites, this is the first that spit out such errors that I don't know how to fix. It was hard with Strict at first, but gets pretty easy once you ran into all the problems it gives. :P And the funny thing is, all the other sites were not for me, but this one is. Hah.

 

You're right about the warning, "<" being as "data". I don't know either, but XHTML 1.0 Transitional also gives the warning.

 

*edit

I fixed error #1 by putting the input in a paragraph as the XHTML validator site has. Thanks. :)

 

Error #2 is still an error in Transitional. So it's not just the Strict.

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.