【问题标题】:Looping resultset displays additional br tag循环结果集显示额外的 br 标记
【发布时间】:2018-07-04 08:28:40
【问题描述】:

我对 PHP 和 PDO 非常陌生,并且正在尝试从一个简单的数据库中获取记录。我创建并设法成功地做到了,但出于某种奇怪的原因,当我 fetchAll() 我的记录并在 echo 语句中添加一个 <br> 标记时,它在我的随机位置添加了一个额外的 <br>输出。我不确定为什么会这样。这是因为我的数据库中有多余的空白吗?

我尝试在网上和其他关于 SO 的主题寻找解决方案;也许我没有找到合适的地方来解决我的问题。

我觉得这是空白的问题,也许我需要为此使用trim

这是我的代码:

// Set all fetch requests as an object by default
$dbo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

$admin = 'ADMIN';
$adminLive = 'ADMIN-live';
$adminType = 'ADMIN_US_Type';
$customusDomestic = 'US_domestic';
$adminChina = 'China_admin';
$adminIndia = 'India_admin';
$adminCustom = 'ADMIN_custom';
$customusaustinCulver = 'US_Austin_Culver';
$customuschinaTokyo = 'US_China_Tokyo';
$customcorkuaeBayarea = 'Cork_UAE_BayArea';
$customchinashanghaiBeijing = 'China_Shanghai_Beijing';
$adminselfMoves = 'ADMIN_selfmoves';
$adminmilanVienna = 'ADMIN-milan-vienna';
$custombayareaSeattle = 'Bayarea_Seattle_admin';

// Prepare the query
$sql = 'SELECT DISTINCT usergroup
        FROM plus_signup
        WHERE usergroup != ?
        AND usergroup != ?
        AND usergroup != ?
        AND usergroup != ?
        AND usergroup != ?
        AND usergroup != ?
        AND usergroup != ?
        AND usergroup != ?
        AND usergroup != ?
        AND usergroup != ?
        AND usergroup != ?
        AND usergroup != ?
        AND usergroup != ?
        AND usergroup != ?';

$stmt = $dbo->prepare($sql);

// Execute the query
$stmt->execute([$admin,$adminLive,$adminType,$customusDomestic,$adminChina,$adminIndia,$adminCustom,$customusaustinCulver,$customuschinaTokyo,$customcorkuaeBayarea,$customchinashanghaiBeijing,$adminselfMoves,$adminmilanVienna,$custombayareaSeattle]);

$usergroups = $stmt->fetchAll();
foreach($usergroups as $locations) {

     // This works fine but my output is adding an extra br in some occurances of the loop
    echo $locations->usergroup . "<br/>";

}

Output in Browser I'm getting

【问题讨论】:

  • 也许在回显之前检查 $locations->usergroup 是否为空
  • 您更愿意使用NOT IN () 吗?您应该清理数据库值。你有空值吗?你有null 值吗?最后是否有带有&lt;br&gt; 标签的非空值?我们看不到,所以我们不知道。 trim() 不会杀死 &lt;br&gt;,但你可以 strip_tags()
  • 好的,谢谢你,我会试试这个并回复你。

标签: php pdo prepared-statement filtering resultset


【解决方案1】:

未经测试,但逻辑应该是正确的:

$dbo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_NUM);  // fetch as indexed array
$dbo->setAttribute(PDO::NULL_TO_STRING: NULL);                     // nulls to empty strings

$nots = [
    '', 
    $admin,
    $adminLive,
    $adminType,
    $customusDomestic,
    $adminChina,
    $adminIndia,
    $adminCustom,
    $customusaustinCulver,
    $customuschinaTokyo,
    $customcorkuaeBayarea,
    $customchinashanghaiBeijing,
    $adminselfMoves,
    $adminmilanVienna,
    $custombayareaSeattle
];

$placeholders = implode(',', array_fill(0, count($nots), '?'));

$sql = "SELECT DISTINCT usergroup FROM plus_signup WHERE usergroup NOT IN ($placeholders)";
try {
    $stmt = $dbh->prepare($sql);
    $stmt->execute($nots);
    $usergroups = $stmt->fetchAll();
    echo implode('<br>', $usergroups);
} catch (PDOException $e) {
    echo $e->getMessage();  // not to be shown publicly
}

这应该消除您的空/空值成为结果集的一部分。

【讨论】:

  • 我明白了,谢谢。我检查了我的数据库,它显示了 43 条记录中的 42 条。 (第 43 条记录是我没有考虑的空行)。谢谢。
  • 如果您实际上要对对象执行一些迭代过程(不仅仅是将它们与&lt;br&gt; 粘合在一起),那么我建议不要使用fetchAll()。您也可以使用fetch() 一次迭代一行结果集
  • 好的,谢谢,我以后一定会注意的。
猜你喜欢
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 2018-07-10
  • 2012-04-08
  • 2012-05-12
相关资源
最近更新 更多