0

このコードを使用しているすべての人員をリストするメインフォームがあるデータベースがあります

<?php
$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
mysql_select_db("datatest", $con);
$result = mysql_query("SELECT * FROM Personnel");
echo "<TABLE BORDER=2>";
echo"<TR><TD><B>Name</B><TD><B>Number</B><TD><B>View</B><TD></TR>";
while ($myrow = mysql_fetch_array($result))
{
echo "<TR><TD>".$myrow["Surname"]." ".$myrow["First Names"]."<TD>".$myrow["Number"];
echo "<TD><a href=\"childdetails.php?EmployeeID=".$myrow["EmployeeID"]."\">View</a>";
}
echo "</TABLE>";
?>
</HTML>

お気づきのように、個人の詳細を表示するためのリンクがありますが、VIEW リンクをクリックすると次のエラーが表示されます。

解析エラー: 構文エラー、C:\Program Files\EasyPHP-12.1\www\my Portable Files\dss4\childdetails.php の予期しない 'EmployeeID' (T_STRING) 6 行目 childdetails.php には次のコードがあります

<HTML>
<?php
$db = mysql_connect("localhost", "root", "");
mysql_select_db("datatest",$db);
$result = mysql_query("SELECT * FROM children; 
WHERE "EmployeeID="["$EmployeeID"],$db);
$myrow = mysql_fetch_array($result);
echo "Child Name: ".$myrow["ChildName"];
echo "<br>Mother: ".$myrow["Mother"];
echo "<br>Date of Birth: ".$myrow["DateOfBirth"];
?>
</HTML>

スタッフをリストする最初のフォームが機能するので、問題はサーバーから返された6行目のchilddetails.phpにあると思いますが、それを修正する方法がわかりません。

注: 人は複数の子供を持つことも、複数の妻を持つこともできます。助けてください

4

3 に答える 3

0

まず、クエリが間違っています。SQLに、スクリプトが終了し、何か新しいものの実行を開始する必要があることを伝えています。以下に、それを適切に行う方法を示します。

また、mysql固有の構文は使用しないでください。これは時代遅れであり、特にsqliteまたはpostgresqlを使用することにした場合は、後で実際の問題が発生する可能性があります。

また、SQLインジェクションを回避するためにプリペアドステートメントを使用する方法を学びます。変数を、SQLの実行可能なスクリプトとしてではなく、プリペアドクエリへの文字列として使用する必要があります。

PDO接続を使用すると、次のように初期化できます。

// Usage:   $db = connectToDatabase($dbHost, $dbName, $dbUsername, $dbPassword);
// Pre:     $dbHost is the database hostname, 
//          $dbName is the name of the database itself,
//          $dbUsername is the username to access the database,
//          $dbPassword is the password for the user of the database.
// Post:    $db is an PDO connection to the database, based on the input parameters.
function connectToDatabase($dbHost, $dbName, $dbUsername, $dbPassword)
{
    try
    {
         return new PDO("mysql:host=$dbHost;dbname=$dbName;charset=UTF-8", $dbUsername, $dbPassword);
    }
    catch(PDOException $PDOexception)
    {
        exit("<p>An error ocurred: Can't connect to database. </p><p>More preciesly: ". $PDOexception->getMessage(). "</p>");
    }
}

そして、変数を初期化します。

$host = 'localhost';
$user = 'root';
$dataBaseName = 'databaseName';
$pass = '';

これで、次の方法でデータベースにアクセスできます。

$db = connectToDatabase($host , $databaseName, $user, $pass); // You can make it be a global variable if you want to access it from somewhere else.

ここで、準備されたクエリとして使用できるクエリを作成する必要があります。つまり、準備されたステートメントを受け入れてクエリを準備し、クエリに実行される変数の配列を実行して、SQLを回避する必要があります。その間に注入:

$query = "SELECT * FROM children WHERE EmployeeID = :employeeID;"; // Construct the query, making it accept a prepared variable.
$statement = $db->prepare($query); // Prepare the query.
$statement->execute(array(':employeeID' => $EmployeeID)); // Here you insert the variable, by executing it 'into' the prepared query.
$statement->setFetchMode(PDO::FETCH_ASSOC); // Set the fetch mode.

while ($row = $statement->fetch())
{
    $ChildName = $row['ChildName'];
    $Mother = $row['Mother'];
    $DateOfBirth = $row['DateOfBirth'];
    echo "Child Name: $ChildName";
    echo "<br />Mother: $Mother";
    echo "<br />Date of Birth: $DateOfBirth";
}

$ EmployeeIDを受け取るには、同様のアプローチを使用する必要がありますが、これは大いに役立ちます。

ちなみに、私が示したように、空白とフォワードスラッシュでブレークタグを閉じることを忘れないでください。

于 2013-03-12T03:23:32.967 に答える
0

私はもっ​​と好きだと思います。

$result = mysql_query("SELECT * FROM children WHERE EmployeeID='$EmployeeID'");
// as far $EmployeeID is actualy set before running a query
//but as comment says don't use mysql better something like this

<?php
$mysqli = new mysqli('localhost', 'root', 'my_password', 'my_db');
if ($mysqli->connect_error) {
    die('Connect Error (' . $mysqli->connect_errno . ') '
        . $mysqli->connect_error);
}
/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT * FROM children WHERE EmployeeID=?")) {

/* bind parameters for markers */
$stmt->bind_param("s", $EmployeeID);

/* execute query */
$stmt->execute();

/* bind result variables */
$stmt->bind_result($Employee);

/* fetch value */
$stmt->fetch();

printf($Employee);

/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
于 2013-03-12T03:14:00.487 に答える