3

私は周りを見回して、同じ問題を抱えている人が何人かいることに気づきましたが、彼らの見落としはここでは当てはまらないようです。

値の配列をテーブルに追加するPHP関数があります。テーブルフィールドにNULLaを配置するために、最初に値が空であるかどうかをチェックし、空である場合はそれらを。に置き換えます。null私が配置している各フィールドは、代わりにそこに配置nullすることを可能にします。null0

ここにいくつかのコードがあります:

public static function AddGame($array, $tId)
{
    global $db; // Bring DB into scope
    // Get IDs from particular names
    $locId = $array['fLocation'];
    // Ensure empty values are SQL null
    $hTeamId = "'{$array['fHomeTeam']}'";
    $vTeamId = "'{$array['fVisitTeam']}'";
    $hScore = "'{$array['fHomeScore']}'";
    $vScore = "'{$array['fVisitScore']}'";
    $hHoldFor = "'{$array['fHomeHoldFor']}'";
    $vHoldFor = "'{$array['fVisitHoldFor']}'";
    // Prepare row for insertion
    $row = "'','$tId','$locId',$hTeamId,$vTeamId,'{$array['fDate']}','{$array['fTime']}',$hScore,$vScore,'{$array['fGameType']}',$hHoldFor,$vHoldFor";
    $stmt = $db->prepare("INSERT INTO `game` VALUES($row)");
    if($stmt->execute()) return true;
    else return false;
}

この関数をさまざまな行でデバッグし、$ row文字列をダンプしました。これは、次のように表示されます。

''、 '1'、 '1'、 '21'、 '21'、 '10/10/12'、 '10:30 AM'、'NULL'、'NULL'、'pool'、'NULL'、 'ヌル'

しかし、テーブルのテキストタイプを確認すると、フィールドの値は文字通りNULL私が望むものではなく、intフィールドもとして表示され0ます。値を空白のままにするか、PHPのnullのままにすると、テキストフィールドは空(​​または必要に応じて適切nullに)として表示されますが、intは引き続きとして表示され0ます。

これは、値を間接的に挿入する方法が原因であると思います。

これがSHOWCREATETABLEですgame

CREATE TABLE `game`(
  `id` int(11)NOT NULL AUTO_INCREMENT、
  `tId` int(11)NOT NULL、
  `Lid` int(11)NOT NULL、
  `hTeamId` int(11)DEFAULT NULL、
  `vTeamId` int(11)DEFAULT NULL、
  `date` text NOT NULL、
  `time`テキストNOTNULL、
  `hScore` int(11)DEFAULT NULL、
  `vScore` int(11)DEFAULT NULL、
  `type` text NOT NULL、
  `hHoldFor`テキスト、
  `vHoldFor`テキスト、
  主キー( `id`)
)ENGINE = InnoDB AUTO_INCREMENT = 17 DEFAULT CHARSET = latin1

アップデート:

INSERT INTO `game` VALUES(''、 '1'、 '1'、''、''、 '10/09/12'、 '9:30 AM'、''、''、'pool'、'winnerプールAの'、'プールBの勝者')
4

4 に答える 4

8

NULL必要な列の値を次の文字列に物理的に設定しています'NULL'

NULL!='NULL'

これらの列のテーブル構造をに設定するNULLと、クエリからそれらを省略でき、自動的NULLに挿入されます。

代わりにこれを行ってください:

if(!empty($hHoldFor)) $hHoldFor = $array['fHomeHoldFor'];

アップデート

私はあなたの例をさらに調べていましたが、2番目の失敗点があります。

$row = ... ",'$hHoldFor','$vHoldFor'";

上記の行を設定$hHoldFor = NULLすると、の周りNULLに引用符が挿入され、。の文字列に戻りますNULL

これを試して:

if(!empty($hHoldFor)) $hHoldFor = "'{$array['fHomeHoldFor']}'";
...  
$row = ... ",$hHoldFor,$vHoldFor";

これにより、QUERY文字列内のこの値を囲む一重引用符が削除され、変数自体に追加されます。

アップデート2

スキーマを使用したSQLFiddleは次のとおりです。NULLNULL列の場合に返されます。echo "INSERT INTOゲームVALUES($row)";をして出力を投稿できますか?問題は、PHPがまだどこかで'に変換NULLしていることです。'NULLこれは私たちがそれの底に到達するのに役立ちます。

アップデート3

問題は同じように考えられています。PHPは''、値ではない空白の文字列、をデータベースに挿入していNULLます。NULLタイプで''あり、長さのない文字列です。

INSERT INTO `game` VALUES('','1','1','','','10/09/12','9:30AM','','','pool','winner of pool A','winner of pool B')

これを試して:

public static function AddGame($array, $tId)
{
    global $db; // Bring DB into scope
    // Get IDs from particular names
    $locId = $array['fLocation'];
    // Ensure empty values are SQL null
    $hTeamId = (strlen($array['fHomeTeam']) != 0 ? "'{$array['fHomeTeam']}'" : 'NULL');
    $vTeamId = (strlen($array['fVisitTeam']) != 0 ? "'{$array['fVisitTeam']}'" : 'NULL');
    $hScore = (strlen($array['fHomeScore']) != 0 ? "'{$array['fHomeScore']}'" : 'NULL');
    $vScore = (strlen($array['fVisitScore']) != 0 ? "'{$array['fVisitScore']}'" : 'NULL');
    $hHoldFor = (strlen($array['fHomeHoldFor']) != 0 ? "'{$array['fHomeHoldFor']}'" : 'NULL');
    $vHoldFor = (strlen($array['fVisitHoldFor']) != 0 ? "'{$array['fVisitHoldFor']}'" : 'NULL');
    // Prepare row for insertion
    $row = "'','$tId','$locId',$hTeamId,$vTeamId,{$array['fDate']}','{$array['fTime']}',$hScore,$vScore,'{$array['fGameType']}',$hHoldFor,$vHoldFor";
    $stmt = $db->prepare("INSERT INTO `game` VALUES($row)");
    if($stmt->execute()) return true;
    else return false;
}
于 2012-08-22T14:31:31.157 に答える
5

を挿入することはできません'NULL'。の周りの一重引用符を削除しますNULL

あなたのひも

'','1','1','21','21','10/10/12','10:30AM','NULL','NULL','pool','NULL','NULL'

次のようになります

'','1','1','21','21','10/10/12','10:30AM',NULL,NULL,'pool',NULL,NULL

INSERT(すなわちINSERT INTO table (col1, col2) VALUES ...)を作成するときはいつでも列リストを定義する必要があります

編集1

私はあなたを通して見ることをお勧めしますSHOW CREATE TABLE tbl_name

編集2

これをテストした後でも、問題はデータの挿入方法にあると言えます。

(18,1,1,21,21,'10/10/12','10:30AM',NULL,NULL,'pool',NULL,NULL)

動作します。

('18','1','1','21','21','10/10/12','10:30AM','NULL','NULL','pool','NULL','NULL')

動作しません:Incorrect integer value: 'NULL' for column 'hScore' at row 1:

編集3

クラスの改良版は次のとおりです。

public static function AddGame($array, $tId)
{
    global $db; // Bring DB into scope

    // Get IDs from particular names
    $locId = $array['fLocation'];

    // Ensure empty values are SQL null
    $hTeamId = empty($array['fHomeTeam']) ? 'NULL' : "'" . $array['fHomeTeam'] . "'";
    $vTeamId = empty($array['fVisitTeam']) ? 'NULL' : "'" . $array['fVisitTeam'] . "'";
    $hScore = empty($array['fHomeScore']) ? 'NULL' : "'" . $array['fHomeScore'] . "'";
    $vScore = empty($array['fVisitScore']) ? 'NULL' : "'" . $array['fVisitScore'] . "'";
    $hHoldFor = empty($array['fHomeHoldFor']) ? 'NULL' : "'" . $array['fHomeHoldFor'] . "'";
    $vHoldFor = empty($array['fVisitHoldFor']) ? 'NULL'  : "'" . $array['fVisitHoldFor'] . "'";

    // Prepare row for insertion
    $row = "$tId,$locId,$hTeamId,$vTeamId,'{$array['fDate']}','{$array['fTime']}',$hScore,$vScore,'{$array['fGameType']}',$hHoldFor,$vHoldFor";
    $stmt = $db->prepare("INSERT INTO game (tId, Lid, hTeamId, vTeamId, date, time, hScore, vScore, type, hHoldFor, vHoldFor) VALUES($row)");
    if($stmt->execute()) return true;
    else return false;
}

値以外の値は引用符NULLで囲まれます。それ以外の場合は、が割り当てられNULLます。また、列であるため、の列リストを定義してINSERT除外idしましたAUTO_INCREMENT

于 2012-08-22T14:35:05.203 に答える
1

列はNULL値を許可しますか?DDLをもう一度確認してください。おそらくDEFAULT VALUEゼロに設定しています。

列に値を挿入しようとするときはnull、一重引用符で囲まないでください。例

INSERT INTO tableName (colName, ColNameB) VALUES (1, NULL)
于 2012-08-22T14:30:28.437 に答える
0

私の場合、Case-empty、Case-yes、Case-noの3つの状況を表示する必要がありました。null、1、0を使用する予定でした。しかし、nullは常に0として保存されていました。作業中の列はnullエントリを受け入れましたが、すべてのnullはゼロとして保存されていました。私の解決策は、Case-emptyをゼロ、Case-yesを1番、case-noを2番と見なすことでした。これは回避策ですが、問題は解決しました。

于 2016-10-18T18:23:10.557 に答える