#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(), что бы она ни делала, также необходимо проверять типы.