PHP从查询结果中删除文本

时间:2014-07-30 21:47:21

标签: php mysql prepared-statement

我创建了一个准备好的语句来从MySQL数据库中获取一些结果,然后我想在同一页面上的几个框中显示这些结果。

我使用相同的预准备语句几次,以获取不同的结果集,然后使用一个片段将其转换为菜单。

出了什么问题:在某些选择框中,文字随机被切断。假设数据库中的文字说“这是一个很长的文本”,我得到“这是一个长篇大论”。在另一个字段中,它只是给出了首字母“E”,而不是包含的3个字。

如果我删除$stmtPedibles->store_result();,文本将不会被删除。但是,如果我这样做,我不能在选择框片段中使用<?php if ($executed_stmt->num_rows > 0) : ?>,这对我很重要,因为我需要知道选择框是否为空。有解决方法吗?

代码:

1。主要文件

   <?php 
    $root = "";
    $thisfile = "index.php";
    require_once($root."includes/setup/user.php");
    require($root."includes/snippets/prepared_queries.php");
    require_once($root."includes/layout/doc_head.php");
    $thisGerencia = "Produccion"; //Ventas, Almacen, Produccion

    //Variables que se repiten en toda la página
    $ped_gerencia = $thisGerencia;
    $ped_usuario = $thisUsr;
?>
<body>
    <h2>Elementos disponibles</h2>
    <h3><?php echo strtoupper($thisGerencia);?> - Diálogos disponibles: </h3>
    <p>Prep statement + build function</p>

    <?php  //PEDIDO 1
    $ped_tipo = "Q";
    $stmtPedibles->execute(); //4. Execute
    $stmtPedibles->bind_result($selText, $selValue, $nada1, $nada2); //5. Bind results (for selects, always include $selValue and $selCodigo)

    //Vars para select: 
    $executed_stmt = $stmtPedibles; //Esto hace que el siguiente snippet funcione. 
    $select_name = "dialogos_pedibles";
    $select_required = TRUE;
    $select_selected = FALSE;
    $default_option_text = "Hacer una pregunta...";

    include($root."includes/snippets/select_box.php");

    ?>
    <?php  //PEDIDO 2

    $ped_tipo = "I";
    $stmtPedibles->execute(); //4. Execute
    $stmtPedibles->bind_result($selText, $selValue, $nada1, $nada2); //5. Bind results (for selects, always include $selValue and $selCodigo)

    //Vars para select: 
    $executed_stmt = $stmtPedibles; //Esto hace que el siguiente snippet funcione. 
    $select_name = "dialogos_pedibles";
    //$select_required = TRUE;
    $select_selected = FALSE;
    $default_option_text = "Hacer una pregunta...";

    include($root."includes/snippets/select_box.php");

    ?>
    <h3><?php echo strtoupper($thisGerencia);?> - Informes disponibles: </h3>
    <?php //PEDIDO 3
    $ped_tipo = "P";
    $stmtPedibles->execute(); //4. Execute
    $stmtPedibles->bind_result($selText, $selValue, $nada1, $nada2); //5. Bind results (for selects, always include $selValue and $selCodigo)

    //Vars para select: 
    $executed_stmt = $stmtPedibles; //Esto hace que el siguiente snippet funcione. 
    $select_name = "informes_pedibles";
    //$select_required = TRUE;
    $select_selected = FALSE;
    $default_option_text = "Solicitar un informe...";
    include($root."includes/snippets/select_box.php");

    $executed_stmt->close();
    $stmtPedibles->close();
    ?>
<?php include($root."includes/setup/user_footer.php");?>
</body>
</html>

2。准备好的陈述

<?php 
$prep_elementos_pedibles = "SELECT EvePar_Pregunta, EvePar_EventoCodigo, EvePar_EventoNombre, EvePar_CodigoInforme
            FROM Estado_Jugador JOIN Eventos_Parametros ON Estado_Codigo = EvePar_EventoCodigo
            WHERE EvePar_EventoLugar = ? AND Estado_Habilitado = 1 AND Evento_EventoTipo = ? AND Estado_usr_name = ?";

$stmtPedibles = $connection->prepare($prep_elementos_pedibles); //1. Prepare
if (!$stmtPedibles) { //2. Check for errors 
    trigger_error('Wrong SQL: ' . $prep_elementos_pedibles . ' Error: ' . $conn->error, E_USER_ERROR); 
}
$stmtPedibles->bind_param("sss", $ped_gerencia, $ped_tipo, $ped_usuario); //3. Bind
?>

3。 select_box代码段

    <?php  
//THIS WAY; TEXT GETS CUT OFF
$executed_stmt->store_result();
if ($executed_stmt->num_rows > 0) :  ?>
    <select name="<?php echo $select_name;?>" class="<?php if ($select_required) {echo "required";} ?>">
        <?php if ($default_option_text !="") : ?>
            <option value=""><?php echo $default_option_text;?></option>
        <?php endif;?>
        <?php while ($executed_stmt->fetch()) :
                if ($select_selected == $selValue) {
                    $selected = " selected='selected' "; 
                } else {
                    $selected = "";
                }
            ?>
            <option value="<?php echo $selValue;?>" <?php echo $selected;?> ><?php echo $selText;?></option>
        <?php endwhile;?>
    </select>
<?php endif;
    $executed_stmt->free_result();
?>

编辑1: 我刚刚清理了代码,因为bad_boy提到我不应该创建一些变量。我将store_resultfree_result移到了选择框片段,希望它们会有所作为,但事实并非如此。

我还附上了表格结构的截图: This is EventoParametros, where the cut off text comes from This is Estado_Jugador, used in the JOIN

我应该放弃使用num_rows吗?这意味着我真的放弃了准备好的陈述......如果我不使用预准备语句,MySQLi是否比MySQL语句更安全?这真是令人沮丧......: - (

2 个答案:

答案 0 :(得分:1)

我真的不知道它为什么要进行随机文本切断的事情,但是如果您可以稍微重新组织选择框的构建方式,似乎可以省去检查num_rows的需要。我想如果你创建一个包含所有<option>的字符串,然后执行你的while ... fetch...事情来创建选项列表,那么你可以在它周围构建<select>的其余部分如果它不是空的,或者如果它不是,那就不要了。像这样:

<?php
$options = "";
while ($executed_stmt->fetch()) {
    if ($select_selected == $selValue) {
        $selected = " selected='selected' "; 
    } else {
        $selected = "";
    }
    $options .= "<option value=\"$selValue\"$selected>$selText</option>";
}
?>
<?php if ($options) : ?>
    <select name="<?php echo $select_name;?>" class="<?php if ($select_required) {echo "required";} ?>">
        <?php if ($default_option_text !="") : ?>
            <option value=""><?php echo $default_option_text;?></option>
        <?php endif;?>
        <?php echo $options;?>
    </select>        
<?php endif; ?>

答案 1 :(得分:0)

我之前看到PHP将字符串切换为一个字符。 PHP非常相似地处理数组和字符串。所以,如果你有你认为的数组并且你想说

$array = array('key'=>'value');
echo $array['key'];
  

value

但$ array实际上是一个字符串

$array = 'value'
echo $array['key'];
  

v

因为PHP评估'key'为“TRUE”而True计算为1然后它吐出字符串的第一个字母(这可能是索引1所以输出将是a但是该点仍然与输出变量的1个字符相同。

至于截断某些变量的字符串,这可能是使用varchar(20)或短于字符串长度的东西插入表中的函数。因此,它被保存为截断的字符串并返回它可能的内容。