2015-01-29 3 views
1

Я не могу получить этот скрипт, который использует объект PDO и MySQL с пользовательскими переменными для работы. Я узнал, что с PDO вы не можете выполнить два запроса в одном вызове, поэтому я разделил его на два вызова query(). Но он все еще не работает. Вот отрывок из моего сценария (подключение к MySQL, конечно, делается в другой файл, я скопировал его здесь, так что все в одном месте только для целей данного вопроса):Объект PDOStatement и переменные, определенные пользователем MySQL

$db_hostname = 'localhost'; 
$db_username = 'username'; 
$db_password = 'pwd'; 
$db_name = 'dbname'; 
$dsn = "mysql:dbname=$db_name; host=$db_hostname"; 

$pdo = new PDO($dsn, $db_username, $db_password); 
$strsql = "SET @num := 0, @tp := ''"; 

$result=$pdo->query($strsql); 

$strsql = "SELECT " . $offer . "_tp AS tp, " . $offer . "_level AS best_offer, Price 
      FROM (
       SELECT " . $offer . "_tp, " . $offer . "_level, Price, 
        @num := if(@tp = `" . $offer . "_tp`, @num + 1, 1) as level, 
        @tp := `" . $offer . "_tp` as dummy 
       FROM tbl_limit_offers 
       WHERE Prod_Code = $procCode) as x    
      WHERE x.level = 1"; 
$result = $pdo->query($strsql); 
echo $result->rowCount() 

Если я бегу, что запрос непосредственно в PHPmyAdmin возвращает несколько записей. Тем не менее, запустив его с объектом PDO я получаю:

Fatal error: Call to a member function rowCount() on a non-object

$result должен быть PDOStatement объекта и rowCount() должен быть один из его методов. Итак, почему он не работает?

+0

пытаются делать var_dump ($ результат), что он не показывается. – justrohu

+0

Попробуйте: '$ result-> fetchColumn()' это делает трюк для вас? (также добавьте 'COUNT (*)' в ваш SQL, прежде чем вы это сделаете) – Rizier123

+0

@justrohu var_dump ($ result) показывает: boolean false – user2395238

ответ

0

Я понял, что случилось с моим кодом. Это был объект PDO. При настройке dsn не может иметь никаких пробелов. После того как я удалил пробел в переменной $dsn, все работало, как ожидалось. Оригинал $dsn переменная (не работает):

$dsn = "mysql:dbname=$db_name; host=$db_hostname"; 

Правильный путь (без пробела после запятой):

$dsn = "mysql:dbname=$db_name;host=$db_hostname"; 
0
  • Вы можете сделать как стипендиатов


    $setNumSql = "set @num = ?"; 
    $stmt = $con->preparedStatement($setNumSql); 
    $stmt->executeQuery($num); 

    $setTpSql = "set @tp = ?"; 
    $stmt = $con->preparedStatement($setTpSql); 
    $stmt->executeQuery($tp); 

    $exampleSql = "select * from tbl where NUM >= @num and TP = @tp"; 
    $stmt = $con->preparedStatement($exampleSql); 
    $stmt->executeQuery(); 
    return $stmt->fetchAll(); 

  • BTW


    $sql = 'SELECT CONCAT(:offer_1, "_tp") AS tp, CONCAT(:offer_2, "_level") AS best_offer ...'; 

    $binds = array(); 
    $binds['offer_1'] = $offer; 
    $binds['offer_2'] = $offer; 

    $stmt = $con->preparedStatement($sql); 
    $stmt->executeQuery($binds); 

лучше



    $sql = "SELECT " . $offer . "_tp AS tp, " . $offer . "_level AS best_offer ..."; 

+0

Вы не можете сделать это без использования подготовленного заявления? Я не передаю никаких значений. – user2395238

+0

Спасибо. Вопрос: использует 'CONCAT' то, как вы указали лучше, потому что оно выглядит лучше или потому, что оно улучшает производительность запроса? – user2395238

+0

Итак, для подтверждения, единственный способ использовать определяемые пользователем переменные с объектом PDO - использовать подготовленные операторы? – user2395238

Смежные вопросы