php - una - Seleccione datos de múltiples tablas en MySQL usando casillas de verificación y muestre el campo de la tabla de acuerdo con la casilla de verificación
seleccionar varios campos de una tabla en mysql (5)
Tengo dos tablas en la base de datos de mis usuarios.
La primera tabla contiene identificación única del usuario, nombre, número de contacto y otra información personal.
La segunda tabla contiene la identificación única del usuario de la primera tabla y la información del dispositivo, como su primer número de máquina, segundo número de máquina y muchos otros también.
Mi tabla no 2 estructura es ..
En la página de informes, estoy mostrando toda la información en forma de tabla usando esta
$sql = "SELECT e.* ,d.* FROM emitra_basic As e INNER JOIN emitra_device as d ON d.uid=e.uid";
$result = $conn->query($sql);
if ($result->num_rows>0) {?>
<table ><tr><td> Uid</td><td> Name</td>
<td> Micro Atm</td>.......and all column of both tables </tr>
<?php while($row = $result->fetch_array()) {
echo "<td>". $row[''uid'']. "</td>";
echo "<td>". wordwrap($row[''name''],15,"/n",1). "</td>"; ....and all
} echo "</table>";
Funciona bien. Pero quiero mostrar un informe personalizado. Significa que quiero dar la casilla de verificación / botón de opción para el usuario del campo de tablas. Si él selecciona el campo usa la casilla de verificación, entonces muestra solo el valor cuya casilla de verificación / botón de radio están seleccionados. Le gusta si el usuario selecciona tres casillas / botón de opción como Uid, name, m_atm. Muestra solo los detalles de tres columnas de ambas tablas y muestra la tabla de visualización de acuerdo con estas columnas.
Cuando desee mostrar la tabla con la columna dinámica, puede usar if....else
loop si conoce exactamente el número de columnas consultadas. Similar a su problema, he creado 2 tablas. Primero, el employee
eId, nombre, dirección
Y segundo es job
jobId, eId, postName, Habilidad
La consulta para recuperar datos es:
$query="SELECT e.Name,e.Address,j.postName,j.Skill FROM employee AS e INNER JOIN job AS j ON e.eId=j.eId";
Para cada columna hay una casilla de verificación
<input type="checkbox" name="chkName"/>
<input type="checkbox" name="chkAddress"/>......for all columns.
GET
valores GET
se compararán con las columnas respectivas.
Para mostrar columnas dinámicamente usando la checkbox
de checkbox
para la consulta anterior:
$checkArray=array();
if(isset($_GET[''chkName'']))
$checkArray[0]=1;
else
$checkArray[0]=0;
if(isset($_GET[''chkAddress'']))
$checkArray[1]=1;
else
$checkArray[1]=0;
if(isset($_GET[''chkPost'']))
$checkArray[2]=1;
else
$checkArray[2]=0;
if(isset($_GET[''chkSkill'']))
$checkArray[3]=1;
else
$checkArray[3]=0;
$query="SELECT e.Name,e.Address,j.postName,j.Skill FROM
employee AS e INNER JOIN job AS j ON e.eId=j.eId";
$result = $con->query($sql);
if ($result->num_rows>0) {
?>
<table >
<tr>
<?php
if($checkArray[0]==1){
?>
<td> Name</td>
<?php
}
if($checkArray[1]==1){
?>
<td> Address</td>
<?php
}
if($checkArray[2]==1){
?>
<td> Post</td>
<?php
}
if($checkArray[3]==1){
?>
<td>Skioll</td>
<?php
}
?>
</tr>
<?php
while($row = $result->fetch_array()) {
echo "<tr>";
if($checkArray[0]==1)
{
echo "<td>". $row[0]. "</td>";
}
if($checkArray[1]==1)
{
echo "<td>". $row[1]. "</td>";
}
if($checkArray[2]==1)
{
echo "<td>". $row[2]. "</td>";
}
if($checkArray[3]==1)
{
echo "<td>". $row[3]. "</td>";
}
echo "</tr>";
}
Espero que esto ayude Cree una variable, por ejemplo: $condition
y asigne un valor como
$condition = "";
if($check1) {
$condition = " AND Uid=$id";
}
if($check2) {
$condition = " AND name=$name";
}
y agregue esta variable de condición $ en su consulta. obtendrás valores dinámicos Para mostrar el resultado, el método simple es usar AJAX en la casilla de verificación marcada.
Simplemente puede usar las casillas de verificación de la siguiente manera en su página
mypage.html
<form>
<input class="form-check" type="checkbox" name="checkName"><label class="form-label">Name</label>
<input class="form-check" type="checkbox" name="checkMicroATM"><label class="form-label">MicroATM</label>
<!--and so on for each field-->
</form>
<div id="dataTable">
<!--Here your table will be displayed-->
</div>
myquerypage.php
if($_POST){
$sql = "SELECT e.* ,d.* FROM emitra_basic As e INNER JOIN emitra_device as d ON d.uid=e.uid";
$result = $conn->query($sql);
$displayColCount=0; // maintain the count of columns to be displayed
$displayCol=array(); // contains the database column names to be displayed on the page
echo ''<div id="dataTable">''; // very useful for replacing the content using ajax call if required
echo ''<table>'';
echo ''<tr>'';
if(isset($_POST[''checkName''])){
$displayCol[$displayColCount++]=''name'';
echo ''<th>Name</th>'';
}
if(isset($_POST[''checkMicroATM''])){
$displayCol[$displayColCount++]=''m_atm'';
echo ''<th>MicroATM</th>'';
}
.
.
// and so on for each column
echo ''</tr>'';
while($row = $result->fetch_array()) {
echo ''<tr>'';
$i=0;
while($i< $displayColCount){
echo "<td>". $row[displayCol[i++]]. "</td>";
}
echo ''</tr>'';
}
echo ''</table>'';
echo ''</div>'';
}
puede llamar a la página de arriba usando ajax como
$(''.form-check'').change(function (e) {
var form=this.form;
var formData = $(''form'').serialize();
$.ajax({
type: ''POST'',
url: ''myquerypage.php'',
data: formData,
cache: false,
success: function (html)
{
$("#dataTable").html(html);
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
});
Espero que esto te ayude.
Creo que entiendo tu punto. El siguiente código se puede usar en el mismo archivo pero, por razones obvias, es mejor separarlos.
Lo que he hecho, tengo una lista de las casillas de verificación basadas en los campos que tienes en la base de datos.
Publique estos campos y ejecute la consulta para obtener datos de solo estos campos que se publican.
Después de generar el código html / tabla con respecto a los campos publicados y los datos
<?php
$result = [];
$fields = [];
$dbFields = [];
$sql = "";
$fieldsNameMapping = [
''e.uid'' => ''Uid'',
''d.block'' => ''Blocked'',
''d.m_atm'' => ''Atm'',
''d.uid_name'' => ''Name''
];
if (isset($_POST)) {
// build query based on the posted fields
if (isset($_POST[''fields'']) && !empty($_POST[''fields''])) {
$sql = "SELECT ";
foreach ($_POST[''fields''] as $fieldValue) {
$sql .= $fieldValue . ", ";
// get field names
$fields[] = $fieldsNameMapping[$fieldValue];
// mapping db field names, remove first two characters
$dbFields[] = substr($fieldValue, 2);
}
// remove last comma
$sql = substr($sql, 0, -2);
$sql .= " FROM emitra_basic As e INNER JOIN emitra_device as d ON d.uid=e.uid";
// get result
$result = $conn->query($sql);
}
}
?>
<form method="post">
<input type="checkbox" name="fields[]" value="e.uid" /> Uid<br />
<input type="checkbox" name="fields[]" value="d.block" /> Blocked<br />
<input type="checkbox" name="fields[]" value="d.m_atm" /> Atm<br />
<input type="checkbox" name="fields[]" value="d.uid_name" /> Name<br />
<input type="submit" value="Show Result" />
</form>
<?php if (!empty($fields)) { ?>
<table>
<thead>
<tr>
<?php foreach($fields as $fieldName) { ?>
<th><?php echo $fieldName ?></th>
<?php } ?>
</tr>
</thead>
<?php if (!empty($result) && $result->num_rows > 0) { ?>
<tbody>
<?php while($row = $result->fetch_array()) { ?>
<tr>
<?php foreach($dbFields as $fieldDbName) { ?>
<td><?php echo $row[$fieldDbName] ?></td>
<?php } ?>
</tr>
<?php } ?>
</tbody>
<?php } ?>
</table>
<?php } ?>
Si te entiendo, para hacer eso debes agregar a ON d.uid=e.uid"
algo como esto ON d.uid=e.uid" AND Uid=$id AND name=$name And m_atm=$atm
, o para agregar esto a donde (a where
I thinght no es bueno)
Por ejemplo
HTML:
<form method="get" action="/a.php">
<input type="checkbox" name="check1" value="text1"/>
<input type="checkbox" name="check2" value="text2"/>
<input id="submit" onclick="f();return false;" type="button" value="ok"/>
</form>
PHP (test.php)
if(isset($_GET[''check1''])) $id=" AND Uid=''$_GET[check1]''"; //if is checked first
if(isset($_GET[''check2''])) $name=" AND name=''$_GET[check2]''"; //if is checked second
/* . . . */
$sql = "SELECT e.* ,d.* FROM emitra_basic As e INNER JOIN emitra_device as d ON (d.uid=e.uid $id $name )";
var_dump($sql);
JS:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script>
function f() {
var url;
var xmlhttp,
url="/text.php?"+$(''form'').serialize(); //change text.php
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} else if (window.ActiveXObject) {
xmlhttp = new ActiveXObject(''Microsoft.XMLHTTP'');
}
xmlhttp.open(''GET'', url, true);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
myfunction(xmlhttp.responseText);
}
}
xmlhttp.send(null);
function myfunction(response) { alert(url+'' ''+response);
//do something
}
}
</script>
Ese código Php es simple, pero puede usar el valor de bucle y clave para que se vea mejor.
Por ejemplo, puede usar <input name=text[]>
para todos los elementos de ckeckboxes y hacer esto
foreach ($_GET[''text''] as $key => $value) {
if($key==0) $key=''uid''; else
if($key==1) $key=''name''; else
if($key==2) $key=''m_atm'';
$q.="$key=''$value'' AND ";
}
$q=substr($q,0,strlen($q)-5);
$sql2 = "SELECT e.* ,d.* FROM emitra_basic As e INNER JOIN emitra_device as d ON (d.uid=e.uid $q )";
var_dump($sql2);