Php PDO绑定比较的两个术语

时间:2016-03-07 18:10:51

标签: php mysql pdo

我试图将使用AJAX接收的两个参数绑定到一个准备好的语句中,使用它们作为比较的术语。当我尝试使用它们时查询出错了,而如果我删除了一个选择获得的那个就可以了。选择是否是失败的可能原因?因为在我执行查询的页面中,字符串正确到达,其值正确。

$.ajax({
        url:"ricerca.php",
        type: "GET",
        data: { azione:"ricerca",
                tcr1:$("#testoPrimoCampo").val(),
                cr1:$("#primoCampoRicerca").val(),
                tcr2:$("#testoSecondoCampo").val(),
                cr2:$("#secondoCampoRicerca").val(),
                ordinamento: ord},
        success:function(result){
            alert(result);
                $("#risRicerca").html(result);
          },
              error: function(richiesta,stato,errori){
                 $("#divElenco").html("<strong>Chiamata fallita:</strong>"+stato+" "+errori);
          }
      });


<form action="ricerca.php" method="GET">
<fieldset>
<legend>Ricerca calciatori</legend>
    <select id="primoCampoRicerca" name="primoCampoRicerca">
      <option value="codicecalciatore">Codice</option>
      <option value="cognomenome">Cognome e nome</option>
      <option value="squadra">Squadra</option>
      <option value="ruolo">Tipo</option>
      <option value="valore">Valore</option>
    </select>   
</fieldset>
</form>

<div id = "risRicerca"></div>

ricerca.php

<?php
/*** mysql hostname ***/
$hostname = 'localhost';
/*** mysql username ***/
$username = 'root';
/*** mysql password ***/
$password = '';
/*** database name ***/
$database_name = 'esempio';
try {
    $dbh = new PDO("mysql:host=$hostname;dbname=$database_name", $username, $password);
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }

if (isset($_GET['azione'])) {
    if (!empty($_GET['tcr1']) && $_GET['tcr1']!='') {
        try {

            echo($_GET["cr1"]);
            $sql = $dbh->prepare("SELECT * FROM calciatori WHERE ? = ?");

            $sql->bindParam(1, $_GET['cr1']);
            $sql->bindParam(2, $_GET['tcr1']);
            $sql->execute();



            echo '<table> <tr> <td>Codice</td> <td>Cognome e Nome</td>     <td>Squadra</td> <td>Ruolo / Tipo</td> <td>Valore</td> </tr>';
            $i = 0;

            $res = $sql->fetchAll();

            foreach ($res as $row){
                $i=$i+1;
                echo '<tr>';
                echo '<td>' . $row['codicecalciatore'] . '</td>';
                echo '<td>' . $row['cognomenome'] . '</td>';
                echo '<td>' . $row['squadra'] . '</td>';
                echo '<td>' . $row['ruolo'] . '</td>';
                echo '<td>' . $row['valore'] . '</td>';
                echo '</tr>';
            }

            echo '</table>';
      echo("$i");
            /*** close the database connection
            $dbh = null;***/
        }
        catch(PDOException $e)
            {
            echo $e->getMessage();
            }
    } else {
    echo("Campi vuoti");
        $_SESSION['istruzione'] = '';
    }
} else {
  echo("Azione non settata");
    $_SESSION['istruzione'] = '';
}
?>

很抱歉,如果varialbes&#39;名字是意大利语,我希望它不会成为问题,谢谢。

1 个答案:

答案 0 :(得分:0)

参数只能用于绑定值,而不能用于名称!

SELECT * FROM calciatori WHERE ? = ?

比较两个值有效,但我认为您希望第一个参数是字段名称。后者不起作用,不应该像这样使用参数。

您可以使用php变量,并确保使用白名单从SQL注入中保存:

$whitelist = array("codicecalciatore" => true, "cognomenome" => true, ...);

if($whitelist[$_GET['cr1']])
{
    $sql = "SELECT * FROM calciatori WHERE " . $_GET['cr1'] . " = ?";
}
else
{
    die("ERROR: unknown fieldname!");
}