Deyimi sorunları gibi SQL

3 Cevap php

Ben mysqli'nin üzerinden hazırlanmış deyimi yürütme sorunlar yaşıyorum.

Önce senkronizasyon hataları dışında Komutanlığı başlamıştı. Ben sonucu depolamak ve bağlantıyı kapatmadan, ve ben bu hatayı alıyorum durmuş, bu yüzden umarım sorun durdu duyuyorum.

Ancak, komutları senkronize değil iken cezası çalışıyordu benim sql sözdizimi hatası, hata, yeniden ortaya çıkmıştır. İşte benim geçerli kod:

Ben vb bağlama önce değişkene% işaretleri atamasını, başarısız olarak yorumladı edilir CONCAT kullanarak itibaren, bu dizimi hatayı düzeltmek için birçok farklı yaklaşımlar denedim. Hiçbir şey çalışır.

Kullanmaya çalışıyorsunuz:

$numRecords->bind_param("s",  "%".$brand."%");

Referansla geçmek için bir hata Sonuçları.

<?php
$con = mysqli_connect("localhost", "blah", "blah", "blah");
if (!$con) {
    echo "Can't connect to MySQL Server. Errorcode: %s\n". mysqli_connect_error();
    exit;
}
$con->query("SET NAMES 'utf8'");
$brand = "o";
$brand = "% ".$brand." %";
echo "\n".$brand;
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE ?";
//CONCAT('%', ?, '%')";
echo "\ntest";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s",  $brand);
    echo "\ntest bind";
    $numRecords->execute();
    echo "\ntest exec";
    $numRecords->store_result();
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = $data->num_rows;
    $numRecords->free_result();
    $numRecords->close();
    echo "/ntest before rows";
    $rows = getRowsByArticleSearch("test", "Auctions", " ");
    $last = ceil($rowcount/$page_rows);
} else {
    print_r($con->error);
}
foreach ($rows as $row) {
    $pk = $row['ARTICLE_NO'];
    echo '<tr>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['USERNAME'].'</a></td>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['shortDate'].'</a></td>' . "\n";
    echo '<td><a href="#" onclick="deleterec(\'Layer2\', \'' . $pk . '\')">DELETE RECORD</a></td>' . "\n";
    echo '</tr>' . "\n";
}
function getRowsByArticleSearch($searchString, $table, $max) {
    $con = mysqli_connect("localhost", "blah", "blah", "blah");
    //global $con;
    $recordsQuery = "SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME, date_format(str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), '%d %m %Y' ) AS shortDate FROM $table WHERE upper(ARTICLE_NAME) LIKE '%?%' ORDER BY str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s')" . $max;
    if ($getRecords = $con->prepare($recordsQuery)) {
    	$getRecords->bind_param("s", $searchString);
    	$getRecords->execute();
    	$getRecords->bind_result($ARTICLE_NO, $USERNAME, $ACCESSSTARTS, $ARTICLE_NAME, $shortDate);
    	while ($getRecords->fetch()) {
    		$result = $con->query($recordsQuery);
    		$rows = array();
    		while($row = $result->fetch_assoc()) {
    			$rows[] = $row;
    		}
    		return $rows;
    	}
    }
}

Tam hatadır:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 11

Hat 11 $ countQuery tanımlayan hattıdır.

Gördüğünüz gibi, marka "o" olarak assined edilir;

Yani SQL ifadesi olmalıdır

SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE %o%;

Hangi elle koydum zaman çalışıyor.

3 Cevap

hmmm, this post on mysql.com seems to suggest that CONCAT() should work: http://forums.mysql.com/read.php?98,111039,111060#msg-111060

Adlandırılmış params kullanarak denediniz mi?

Sen aramak için deneyin:

$numRecords->bind_param("s", "%".$brand."%");

ama sql:

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE ?";

shouldn't it be? (note the LIKE ?s)

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE ?s";

Sorun hazır açıklamada değil, ama orada olmamalı 'sorgu' yöntemi çağrısı - bu "standart" (hazır değil) ifadeleri çalıştırmak için kullanılır gibi.

$data = $con->query($countQuery) or die(print_r($con->error));
$rowcount = $data->num_rows;

olmalıdır

$rowcount = $numRecords->num_rows;

getRowsByArticleSearch fonksiyonu, tekrar sorgu bırakmak ve çıkış için bind_result geçirilen değişkenleri kullanmak gerekir:

  $getRecords->bind_result($ARTICLE_NO, $USERNAME, $ACCESSSTARTS, $ARTICLE_NAME, $shortDate);
  while ($getRecords->fetch()) {
    $pk = $ARTICLE_NO;
    echo '<tr>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$USERNAME.'</a></td>' . "\n";
    // etc...
  }

Biraz daha fazla bilgi için, bind_result PHP'nin kılavuzunu kontrol: http://php.net/manual/en/mysqli-stmt.bind-result.php