代码之家  ›  专栏  ›  技术社区  ›  Alan

PHP:PDOStatement simple MySQL Select不起作用

  •  1
  • Alan  · 技术社区  · 15 年前

    我用下面的PHP代码做了一个非常简单的选择表。

    $statement = $db->prepare("SELECT * FROM account WHERE fbid = :fbid");
    $statement->bindParam(":fbid",$uid, PDO::PARAM_STR,45);
    $out = $statement->execute();
    print_r($out) // 1;
    //$out = $statement->execute(array(':fbid' => $uid)); // also doesn't work
    $row = $statement->fetch();
    

    $out $row 为空。

    编辑:

    $statement->debugDumpParams();

    SQL: [40] SELECT * FROM account WHERE fbid = :fbid Params: 1 Key: Name: [5] :fbid paramno=-1 name=[5] ":fbid" is_param=1 param_type=2

    $statement = $db->prepare("SELECT * FROM account WHERE fbid = $uid");
    $out = $statement->execute();
    $row = $statement->fetch();
    

    包含我期待的记录。

    我不知所措。我正在使用PDO::prepare()、bindParams()等来防止SQL注入(可能我错了)。

    编辑: 在我的例子中,$uid是一个数字字符串(即只包含数字的字符串)。在数据库中,列类型是VARCHAR(45)

    编辑:

    如果我将数据库类型从VARCHAR(45)更改为BIGINT,两个查询都可以工作。如果我再次将数据库类型中的类型改回VARCHAR(45),它就可以工作了。那是什么原因呢?

    请停下来。

    5 回复  |  直到 15 年前
        1
  •  0
  •   Jayrox    15 年前

    我想你的PDO安装可能有问题。

    $uid = 552192373; // my facebook uid for testing
    $statement = $db->prepare("SELECT * FROM users WHERE facebook_uid = :fbid");
    $statement->bindParam(":fbid",$uid, PDO::PARAM_STR,45);
    $out = $statement->execute();
    $row = $statement->fetch(PDO::FETCH_ASSOC);
    echo '<pre>';
    print_r($row);
    echo '</pre>';
    

    退货:

    Array
    (
        [id] => 1
        [facebook_name] => Jason Boehm
        [facebook_uid] => 552192373
    )
    
        2
  •  1
  •   xqterry    15 年前

    你必须保持fbid在string中只包含PHP中的[0-9],不管它在MySQL中存储为BIGINT或VARCHAR,MySQL只接受string sql语句并总是以string格式返回结果。

    $mi = new mysqli("localhost", "root", "xxx", "test");
    $uid = "12379739851403943597";   // Works
    //$uid = 12379739851403943597;   // never Works
    //$uid = (string) 12379739851403943597;   // get "1.2379739851404E+19" wrong string !
    //$suid = sprintf("%.0f", $uid);          // get "12379739851403943936" lost precise
    
    $stmt = $mi->prepare("select * from bitest where id = ?");
    $stmt->bind_param('s', $uid);
    
    $stmt->execute();
    $stmt->bind_result($id, $name);
    
    $stmt->store_result();
    print "numrow: " . $stmt->num_rows . " - \n";
    $stmt->fetch();
    print "$id - $name \n";
    $stmt->free_result();
    
    $stmt->close();
    
    
    $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'xxx');
    $sql = "select * from bitest where id = ?";
    
    $sth = $pdo->prepare($sql);
    $sth->bindParam(1, $uid, PDO::PARAM_STR);
    
    $sth->execute();
    var_dump($sth->fetchAll(PDO::FETCH_ASSOC));
    
        3
  •  0
  •   Charles    15 年前

    execute 取而代之的是:

    $statement->execute(array( 'fbid' => $uid ));

        4
  •  0
  •   goat    15 年前

    除此之外,请记住bindParam()将变量作为引用。可能您的演示代码没有显示在调用execute()之前更改该变量的值。如果需要,请参阅bindValue()。

        5
  •  0
  •   Steve-o    15 年前

    尝试删除额外的参数,

    $statement->bindParam (":fbid", $uid, PDO::PARAM_STR);
    

    (编辑) trim() 和传递值:

    $statement->bindValue (":fbid", trim($uid), PDO::PARAM_STR);