0

私はこれに多くの時間を費やしてきましたが、それを行うために必要な最善の方法についてはわかりません

特定の情報を消去するために、選択時に実行されるクエリを使用してデータベースに数値を追加する小さな Web プログラムがあります。これらのクエリは、特定の列の数値が 13 桁の場合にのみ成功します。理由はわかりません。

だから私の質問は、sqlまたはphpのいずれかを使用して、sqlの列の数字を13に自動変換する最良の方法は何ですか.

私がphpで実行しているクエリは非常に単純ですが、なぜ13が必要なのかよくわかりません

コードは次のとおりです

<?php include_once "ewcfg9.php" ?>
<?php include_once "adodb5/adodb.inc.php" ?>
<?php include_once "phpfn9.php" ?>
<?php include_once "Productsinfo.php" ?>
<?php include_once "userfn9.php" ?>
<?php
$upc= $_GET['upc'];
sleep(2);
header('Location: Productsedit2.php?upc='.$upc.'');
$serverName = "localhost";
$usr="sl";
$pwd="o.o";
$db="SimpleLabel";

$connectionInfo = array("UID" => $usr, "PWD" => $pwd, "Database" => $db);

$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false)

{

print_r( sqlsrv_errors());

}

$sql="Delete from labelprint where upc=$upc";

$query = sqlsrv_query($conn, $sql) or die(sqlsrv_errors());
$result=sqlsrv_fetch_array($query);
print_r($result); 
sqlsrv_close( $conn);

?>

これは機能しますが、upc=13 桁の場合にのみ機能します。SQL ですべてを 13 桁にするか、php でフィールドを 13 桁で自動入力する方法があるかどうか、誰でも考えることができますか?

4

3 に答える 3

2

列は文字列型なので、そのように扱う必要があります。(オプションは、数値列を使用してからPHPランドで埋め込むか、ゼロフィルを使用することです[SQL Serverにはゼロフィルがあると思います]。)

実際にはプリペアド ステートメントを使用する必要がありますが、少なくとも SQL に入力した文字列をエスケープする必要があります。SQL インジェクションについて調べてみるとよいでしょう。


とにかく、私はsprintfを使用します:

$padded = sprintf("%013d", (int) $upc);

次に、これ:

$sql="Delete from labelprint where upc=$upc";

になるだろう

$sql="Delete from labelprint where upc='$padded'";

数値ではなく文字列であるため、単一引用符が必要です。sprintf 呼び出しでの int キャストは、$padded 出力を安全に SQL ステートメントに入れることが保証されるようにするためのものです。


str_repeat と strlen の組み合わせを使用して、文字列を埋め込むこともできます。

于 2012-08-28T14:13:03.173 に答える
0

labelprintフィールドが int の場合 (この場合、なぜvarcharとして保存するのですか) 次のようにキャストできます。

$sql="Delete from labelprint where cast(upc as unsigned)=$upc";

ただし、面白いデータが含まれている場合、これは機能しません。たとえば、13 としてキャストされますが、13 としてキャストされ0000000000013ませ13000000AB00013

編集: SQL-Server Int は 4 バイトかもしれませんが、-2^31 (-2,147,483,648) から 2^31-1 (2,147,483,647) の範囲になります (明らかに4 つの数値ではありません)

データ型の変更により、上記の回答もかなり冗長になります。

于 2012-08-28T14:11:31.333 に答える
0

フィールドに int の代わりに文字列を使用している場合は、これを試すことができます。

$upc = str_pad($upc, 13, "0", STR_PAD_LEFT);

これは0、「フィラー」として使用して、最大 13 文字になるように文字列をパディングします。

詳細: http://php.net/manual/en/function.str-pad.php

于 2012-08-28T14:19:34.693 に答える