PHP muestra datos usando el rango de fechas

Aquí está, tengo la respuesta.

Acabo de cambiar en track_reports.php para que sea:

if (isset($_POST['chkOtdate']))
                    {
                        $date_from = $_POST['date_from'];
                        $date_to = $_POST['date_to'];
                        if (empty($bagianWhere))
                        {
                            $bagianWhere .= "ot_date between '$date_from' and '$date_to'";
                        }
                        else
                        {
                            $bagianWhere .= " AND ot_date between '$date_from' and '$date_to'";
                        }
                    }

y ahora no hay problema, el código se puede ejecutar sin problemas. Gracias por sus ayudas amigos. Agradecemos con sus sugerencias y comentarios.


Tengo un problema con mi código a continuación:

  1. ver_informe.php

Podemos ver el informe basado en badge_id, employee_name y ot_date (con un rango). Cuando trato de encontrar usando badge_id y employee_name no hay problema, se muestran los datos. Pero cuando trato de encontrar usando el rango de fechas, se encontró un error. el error es: : mysql_fetch_array() expects parameter 1 to be resource, boolean given in on line WarningC:\xampp\htdocs\siix_dev\overtime\track_reports.php327

<form method="post" action="track_reports.php" name="form">
                    <table id="mytable">
                        <tr>
                            <td>
                                <input type="checkbox" name="chkBadge" onClick="apply(this.checked, 'textBox')"> <font class="category">Badge ID</font>
                            </td>

                            <td>
                                <input id="textBox" class="text sign" type="text" name="badge_id">
                            </td>
                        </tr>

                        <tr>
                            <td>
                                <input type="checkbox" name="chkEmp" onClick="apply(this.checked, 'textBox2')"> <font class="category">Employee Name</font>
                            </td>

                            <td>
                                <input id="textBox2" class="text sign" type="text" name="employee_name">
                            </td>
                        </tr>

                        <tr>
                            <td>
                                <input id="myCheckBox" type="checkbox" name="chkOtdate" onClick="apply(this.checked, 'textBox3')" onChange="apply(this.checked, 'textBox4')"> <font class="category">OT Date</font>
                            </td>

                            <td>
                                <font class="category">From</font> <input id="textBox3" class="text sign" type="text" name="date_from" ><font class="category"> To</font> <input id="textBox4" class="text sign" type="text" name="date_to" >
                            </td>
                        </tr>

                        <tr>
                            <td></td>
                            <td>
                                <input type="submit" name="submit" value="Submit">
                            </td>
                        </tr>
                    </table>
                </form>
  1. seguimiento_informes.php

                    $bagianWhere = "";
    
                    if (isset($_POST['chkBadge']))
                    {
                        $badge_id = $_POST['badge_id'];
                        if (empty($bagianWhere))
                        {
                            $bagianWhere .= "badge_id = '$badge_id'";
                        }
                    }
    
                    if (isset($_POST['chkEmp']))
                    {
                       $employee_name = $_POST['employee_name'];
                       if (empty($bagianWhere))
                        {
                            $bagianWhere .= "employee_name LIKE '$employee_name'";
                        }
                        else
                        {
                            $bagianWhere .= " AND employee_name LIKE '$employee_name'";
                        }
                    }
    
                    if (isset($_POST['chkOtdate']))
                    {
                        $date_from = $_POST['date_from'];
                        $date_to = $_POST['date_to'];
    
                        $query=mysql_query("select badge_id, employee_name from t_submissions where ot_date between '$date_from' and '$date_to'");
                        while($row=mysql_fetch_array($query)){
                            echo $row['badge_id'];
                            echo $row['employee_name'];
                        }
                    }
    
                    $query = "SELECT * FROM t_submissions WHERE ".$bagianWhere;
                    $hasil = mysql_query($query);
                    echo "                      
                    <div id='main' class='wrapper'>
                                    <div class='content-area'>
    
                    <table cellspacing='0' class='font'>";
                    echo "<tr><th class='th'>Badge ID</th><th class='th'>Employee Name</th><th class='th'>OT Date</th><th class='th'>Department</th><th class='th'>OT From</th><th class='th'>OT To</th><th class='th'>Remarks</th><th class='th'>Submissions By</th><th class='th'>Acknowledged By</th><th class='th'>Approved By</th></tr>";
                    while ($data = mysql_fetch_array($hasil))
                    {
                       echo "<tr><td class='td'>".$data['badge_id']."</td><td class='td'>".$data['employee_name']."</td><td class='td'>".$data['ot_date']."</td><td class='td'>".$data['dept_name']."</td><td class='td'>".$data['ot_from']."</td><td class='td'>".$data['ot_to']."</td><td class='td'>".$data['remarks']."</td><td class='td'>".$data['submission_by']."</td></tr>";
                    }
                    echo "</table>
                    <br>
                    <input type='button' VALUE='Back' onClick='history.go(-1);return true;'>
                    </div>
                    </div>
                    ";
    
                    ?>
    

Puede ayudarme alguien ? Apreciar con sus ayudas.

preguntado el 03 de mayo de 12 a las 09:05

Vamos a saber cuál es el error en sí. -

Su código es vulnerable a la inyección de SQL. Ustedes realmente debe usar declaraciones preparadas, en las que pasa sus variables como parámetros que no se evalúan para SQL. Si no sabe de lo que hablo o cómo solucionarlo, lea la historia de Mesas Bobby. -

este es el error señor: mysql_fetch_array() espera que el parámetro 1 sea un recurso, booleano dado en línea AdvertenciaC:\xampp\htdocs\siix_dev\overtime\track_reports.php327 -

¿En qué formato ingresó las fechas en su formulario? Como cuadros de texto cuyo valor se utiliza como comparación directa con el campo de la base de datos, debe tener el mismo formato que ese campo (si la columna es de tipo DATE, entonces MySQL requiere tales literales para 'yyyy-mm-dd'). -

Para detectar el error, debe probar $hasil para ver si la consulta tuvo éxito antes de llamar mysql_fetch_array(). -

2 Respuestas

Asegúrese de que el tipo de datos de ot_date sea datetime O no ? tal vez usaste varchar

contestado el 03 de mayo de 12 a las 09:05

¿Cuál es el tipo de datos de ot_date? Sumit

En sus comentarios anteriores, afirma que el ot_date columna en la que está almacenando sus "fechas" tiene tipo VARCHAR. Por lo tanto, MySQL no reconoce sus contenidos como fechas en absoluto, sino que los trata como una secuencia de caracteres sin sentido (para él) (como una palabra).

Lo mejor que podría hacer es modificar su base de datos para que dichas fechas se almacenen en un formato que MySQL reconozca como una fecha, como el DATE tipo de datos. Para hacer esto sin perder sus datos existentes:

  1. Cambie el nombre de la columna existente y agregue una nueva en su lugar:

    ALTER TABLE t_submissions
      CHANGE ot_date ot_date_old VARCHAR(size),
      ADD    ot_date DATE [NOT NULL] AFTER ot_date_old;
    
  2. Copie el contenido de la columna anterior en la nueva, como fechas:

    UPDATE t_submissions SET ot_date = STR_TO_DATE(ot_date_old, '%d-%b-%Y');
    
  3. Verifique que la nueva columna contenga los datos esperados:

    SELECT ot_date, ot_date_old FROM t_submissions;
    
  4. Elimina la columna anterior (opcional):

    ALTER TABLE t_submissions DROP ot_date_old;
    

Luego, para que su consulta funcione, MySQL necesita saber cómo convertir las fechas enviadas en fechas en lugar de tratarlas como cadenas:

SELECT badge_id, employee_name FROM t_submissions
WHERE ot_date BETWEEN STR_TO_DATE('%d-%b-%Y', ?) AND STR_TO_DATE('%d-%b-%Y', ?)

Tenga en cuenta que he usado ? en lugar de las variables de fecha porque, como mencioné en mis comentarios anteriores, su código actualmente está sujeto a inyección de SQL y usted realmente debería pasar tales variables a MySQL como parámetros a una declaración preparada (como tal, no se evaluarían para SQL). Leer sobre Mesas Bobby , para obtener más información.

También tenga en cuenta que su forma actual requiere el usuario debe ingresar las fechas en los cuadros de texto en el formato especificado, o de lo contrario la consulta fallará. Sería mejor pedirle al usuario que seleccione partes de fechas de los menús desplegables (o alguna forma de control de calendario) y/o realice una validación para garantizar que las fechas enviadas estén en el formato correcto.

Finalmente, debe probar el resultado de su consulta para ver si tuvo éxito antes de intentar leer un conjunto de registros que podría no existir (como de hecho no existió en este caso).

contestado el 03 de mayo de 12 a las 09:05

Aquí está, tengo la respuesta. Simplemente cambio track_reports.php para que sea: if (isset($_POST['chkOtdate'])) { $date_from = $_POST['date_from']; $fecha_hasta = $_POST['fecha_hasta']; if (vacío($bagianDónde)) { $bagianDónde .= "ot_date entre '$date_from' y '$date_to'"; } else { $bagianDónde .= " Y ot_date entre '$date_from' y '$date_to'"; } } y ahora no hay problema, el código se puede ejecutar sin problemas. Gracias por sus ayudas amigos. Agradecemos con sus sugerencias y comentarios. - david alwis

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.