Сохранение значений запроса MySQL в vars с помощью PHP

#php #mysql

#php #mysql

Вопрос:

Я пытаюсь сохранить переменные из подготовленных MySQL запросов в vars PHP для вставки в текстовые поля..

 function printform2($db, $ssn) {

$query="SELECT e.fname, e.minit, e.lname, e.ssn, e.bdate, 
      e.address, e.sex, e.super_ssn, e.salary,
      CONCAT(d.dnumber, ' (', d.dname, ')' ) as dept
FROM (employee e LEFT JOIN employee s ON e.super_ssn = s.ssn) 
LEFT OUTER JOIN department d ON e.dno = d.dnumber
WHERE e.ssn=$ssn";


$qstmt = $db->prepare($query, array(), MDB2_PREPARE_RESULT);
$qres = $qstmt->execute(NULL);

if (MDB2::isError($qres)) {
    die("query not successful: " . $qres->getMessage());
}

$myrow=mysql_fetch_array($qres, MYSQL_ASSOC);


print "<h3>Table of Employees</h3>";
table_format($qres);
print "<p>";



print <<<END
<b>This form is for updating the employee with ssn $ssn</b><p>
<form method="post" action="">
<input type="text" name="ssn" value="$ssn" readonly> SSN of employee<p>
<br><input type="text" name="fname" value="$myrow[fname]"> First Name
<br><input type="text" name="minit" value="$myrow[minit]"> Middile Initial
<br><input type="text" name="lname" value="$myrow[lname]"> Last Name
<br><input type="text" name="bdate" value="$bdate"> Birth Date
<br><input type="text" name="address" value="$address"> Address
<br><input type="text" name="sex" value="$sex"> Sex
<br><input type="text" name="salary" value="$salary"> Salary
<br><input type="text" name="dno" value="$dno"> Department Number
<br><input type="text" name="super_ssn" value="$super_ssn"> Supervisor SSN
<p><input type="submit" name="update" value="Update">
</form>
END;
    makePageButtons();
}
  

То, что я получаю, — это пустые текстовые поля для тех, в которые я пытаюсь отобразить myrow var.. Есть ли что-то особенное, что мне нужно сделать при работе с подготовленными операторами и тем, как они выводятся? Я в замешательстве, потому что это работает с «ванильным» оператором mysql_query (..)..

Ответ №1:

Вы делаете это неправильно. Прекратите смешивать mysql_ * и PDO;

Это должно быть что-то вроде этого

 <?php

function printform2($db, $ssn) {

$query="
    SELECT 
        e.fname AS firstname, 
        e.minit AS minit, 
        e.lname AS lastname,
        e.ssn AS ssn, 
        e.bdate AS birthdate, 
        e.address AS agress, 
        e.sex AS gender, 
        e.super_ssn AS super_ssn, 
        e.salary AS salary,
        concat(d.dnumber, ' (', d.dname, ')' ) as dept
    FROM 
        employee AS e 
    LEFT JOIN 
        employee AS s ON  e.super_ssn = s.ssn 
    LEFT OUTTER JOIN 
        department AS d ON e.dno = d.dnumber
    WHERE
        e.ssn=:ssn";

$statement = $db->prepare( $query );
$statement->bindValue(':ssn', $ssn, PDO::PARAM_INT );

if ( !$statement->execute() ){
    die("query not successful: " . $statement->errorInfo());
}

$data = $statement->fetch( PDO::FETCH_ASSOC );
?>

<h3>Table of Employees</h3>
<p><strong>This form is for updating the employee with ssn <?php echo $ssn; ?></strong><p>
<form method="post" action="">
    <ul>
        <li>
            <input type="text" name="ssn" id="ssn" value="<?php echo $ssn; ?>" readonly>
            <label for="ssn">SSN of employee</label>
        </li>
        <li>
            <input type="text" name="fname" id="fname" value="<?php echo $data['firstname']; ?>">
            <label for="fname"> First Name</label>
        </li>
        <li>
            <input type="text" name="minit" id="minit" value="<?php echo $data['minit']; ?>">
            <label for="minit">Middile Initial</label>
        </li>
        <li>
            <input type="text" name="lname" value="<?php echo $data['lastname']; ?>">
            <label>Last Name</label>
        </li>
        <!-- SNIP -->
        <li>
            <input type="text" name="super_ssn" value="<?php echo $data['super_ssn']; ?>">
            <label>Supervisor SSN</label>
        </li>
        <li>
            <input type="submit" name="update" value="Update">
        </li>
    </ul>
</form>

<?php
    makePageButtons();
}
  

(код не был протестирован)

Ответ №2:

mysql_fetch_array в этой ситуации не работает.

Вам нужно вызвать after execute()

 $myrow= $qstmt->fetch(PDO::FETCH_ASSOC);
  

Ответ №3:

 $myrow=mysql_fetch_array($qres, MYSQL_ASSOC);
  

Это недопустимо. $qres является объектом результата PDO, который абсолютно бессмыслен для mysql_*() функций. Если у вас была проверка ошибок, например

 $myrow=mysql_fetch_array($qres, MYSQL_ASSOC) or die(mysql_error());
                                            ^^^^^^^^^^^^^^^^^^^^^^
  

вы бы получили обычное сообщение об ошибке «ожидаемый дескриптор результата, вместо этого получил XXX».

Ответ №4:

Вы пытаетесь извлечь строки с помощью mysql_fetch_array(), для чего нужен ресурс, и вы предоставляете ему объект класса MDB2_Result. Не смешивайте ванильные функции с методами mdb2. Вам следует использовать $myrow=$qres->fetchRow(MDB2_FETCHMODE_ASSOC); Также вашу функцию table_format(), что бы она ни делала, также необходимо проверять типы.