我创建了一个准备好的语句来从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_result
和free_result
移到了选择框片段,希望它们会有所作为,但事实并非如此。
我还附上了表格结构的截图:
我应该放弃使用num_rows吗?这意味着我真的放弃了准备好的陈述......如果我不使用预准备语句,MySQLi是否比MySQL语句更安全?这真是令人沮丧......: - (
答案 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)或短于字符串长度的东西插入表中的函数。因此,它被保存为截断的字符串并返回它可能的内容。